getopt は、コマンド行のオプションを分割して、シェル手続きによる解析を容易にし、オプションの妥当性を検査します。getopt は、LC_CTYPE 環境変数で指定されたロケール(environ(5) の LANG 参照)に従って、optstring に指定された引き数のサプルメンタリコードセット文字を認識します。
optstring は、認識されたオプション文字の文字列です。getopt(3C) を参照してください。文字の次にコロンがついている場合、そのオプションは引き数を持ちますが、この引き数は、空白スペースで区切っても区切らなくてもかまいません。特殊オプション -- は、オプションの終わりを示すために使用されます。これを明示的に使用する場合、getopt はそれを認識します。そうでない場合、getopt がそれを作成します。いずれの場合にも、getopt は -- をオプションの終わりに置きます。シェルの位置パラメータ($1 $2 . . . )はリセットされ、各オプションの前に - をつけて各オプションが個別の位置パラメータに入るようにされます。また、各オプション引き数も、個別の位置パラメータに解析されます。
オプションを再スキャンするときは、OPTIND を 1 にリセットしてください。
getopt は、コマンドの構文規格(intro(1) 参照)の規則 8、空白スペースおよび引用符で区切られたオプションの次にあるオプション引き数グループを許可するというルールの一部をサポートしません。例えば、下記のコマンドは正しく処理されません。
cmd -a -b -o "xxx z yy" file
この問題の対策として、getopt の代わりに getopts コマンドを使用してください。
オプション引き数をとるオプションの後に、optstring にリストされているオプションと同じ値が続く場合(上記の「使用例」の項を参考にし、コマンド行 cmd -o -a file を使用します)、getopt は -a を常に -o に対するオプション引き数として扱い、-a をオプションとしては認識しません。この場合、使用例にある for ループは、file 引き数をとばしてシフトします。
set -- `getopt abo: $` if [$? != 0] then echo $USAGE exit 2 fi for i in $
do case $i in -a | -b) FLAG=$i; shift;; -o) OARG=$2; shift 2;; --) shift; break;; esac done
このコードは、下記のいずれかを等しいものとして受け入れます。
cmd -aoarg file file
cmd -a -o arg file file
cmd -oarg -a file file
cmd -a -oarg -- file file