GETOPT(1)

名称
getopt - コマンドラインオプションの解釈を行う

書式
set -- `getopt optstring $*`

解説
getopt は、シェルプロシジャによって簡単に解釈できるようにコマンドライン上の オプションを切り分けます。そして、正しいオプションであるかを確かめます。 optstring は、認識されるオプション文字の文字列です ( getopt(3) を参照 )。 オプション文字のあとにコロン (``:'') がある場合、そのオプションは、 ( 空白文字で区切られているかもしれない ) 引数を持つことになります。 特別なオプション ‘--’ は、オプションの終りを区別するために使われます。 getopt は、オプションの最後に引数として ‘--’ を配置します。または、それが陽に使われた時はそれを終りと認識します。 シェル変数 ($1 $2 ...) は、個々のオプションが ‘-’ に続くように再設定されます。そして、それ自身をシェル変数にします。 各オプション引数は、同様にそれ用のシェル変数に入れられます。

使用例
以下のコードの断片は、 引数無しの -a, -b オプションと、 引数ありの -o オプションを取ろうとしているコマンドのために、どのようにして 引数を処理するのかを示しています。

    set -- `getopt abo: $*`
    if test $? != 0
    then
    	echo 'Usage: ...'
    	exit 2
    fi
    for i
    do
    	case "$i"
    	in
    		-a|-b)
    			flag=$i; shift;;
    		-o)
    			oarg=$2; shift; shift;;
    		--)
    			shift; break;;
    	esac
    done

このコードは、以下の ( コマンド指定の ) 例のどれでも同じように 受け入れます。

    cmd -aoarg file file
    cmd -a -o arg file file
    cmd -oarg -a file file
    cmd -a -oarg -- file file

関連項目
sh(1), getopt(3)

診断
getopt は、 optstring 中に含まれていないオプション文字に出会った時に、 標準エラー出力にエラーメッセージを表示します。

歴史
Bell Labs のマニュアルによると、 Henry Spencer によって書かれました。 振舞いは、Bell Labs 版と同じであると信じています。

バグ
getopt(3) が持っているバグは、そのまま持っています。

空白文字やシェルのメタキャラクタを含んだ引数は、一般に元のまま 残りません。 これは直すのは簡単に思われますが、そうではありません。

不正なオプションに対するエラーメッセージは、 getopt を実行するシェルプロシジャから返すのではなく、 getopt から返されます。 これも直すのは困難です。

シェルオプションの値を分離すること無く、引数を指定するための set コマンドを使うためのとっても良い方法は、シェルのバージョンを 変えることです。