args=`getopt abo: $*` # `getopt abo: "$@"` を使ってはなりません。 # 以下の set コマンドとは異ったように、引数を解釈してしまうためです。 if [ $? -ne 0 ] then echo 'Usage: ...' exit 2 fi set -- $args # set コマンドを、バッククォートした getopt と共に、直接使用できません。 # getopt の終了コードが set のもので隠されてしまうからです。 # set の終了コードは 0 と定義されています。 for i do case "$i" in -a|-b) echo flag $i set; sflags="${i#-}$sflags"; shift;; -o) echo oarg is "'"$2"'"; oarg="$2"; shift; shift;; --) shift; break;; esac done echo single-char flags: "'"$sflags"'" echo oarg is "'"$oarg"'"
このコードは、以下の (コマンド指定の) 例のどれでも同じように 受け入れます。
cmd -aoarg file file cmd -a -o arg file file cmd -oarg -a file file cmd -a -oarg -- file file
空白文字やシェルのメタキャラクタを含んだ引数は、一般に元のまま 残りません。 これは直すのは簡単に思われますが、そうではありません。 や本マニュアルの使用例を直そうとする人は、 Fx 中のこのファイルの履歴を確認すべきです。
不正なオプションに対するエラーメッセージは、 を実行するシェルプロシージャから返すのではなく、 から返されます。 これも直すのは困難です。
シェルオプションの値を分離すること無く、引数を指定するための set コマンドを使うためのとっても良い方法は、シェルのバージョンを 変えることです。
引数を部分的に正しく解釈するために、 各シェルスクリプトは (前記使用例のような) 複雑なコードを持つ必要があります。 より良い getopt 的ツールは、複雑な部分の大半をツールの中に移動し、 クライアントのシェルスクリプトを単純にするものでしょう。