2008-09-29

可搬なシェルスクリプト (2)

SUSv3は計算結果がnullか0でなければexprが0で終了すると規定している。

#! /bin/sh

set -e

output="-"

while getopts "ho:" opt; do
    case "$opt" in
        h)
            printf 'Usage: %s [ -h ] [ -o FILE ] [file...]\n' "$0"
            exit 1
            ;;
        o)
            output="$OPTARG"
            ;;
        ?)
            exit 1
            ;;
    esac
done

shift=`expr "$OPTIND" - "1"`
shift "$shift"

printf '[output=%s]\n' "$output"
printf '[%s]\n' "$@"

なにもオプションを指定しないと、シェルスクリプトは期待したように動作しない。shift=`expr "$OPTIND" - "1"`$OPTINDが1のときに0で終了する。set -eはコマンドが正常に終了しなかった場合にシェルスクリプトをただちに終了する。

shift=`expr "$OPTIND" - "1" || true`
shift "$shift"

0 件のコメント: