.\" %FreeBSD: src/usr.bin/getopt/getopt.1,v 1.19 2004/07/07 17:39:16 ru Exp % .\" .\" $FreeBSD$ .Dd April 3, 1999 .Dt GETOPT 1 .Os .Sh 名称 .Nm getopt .Nd コマンドラインオプションの解釈を行う .Sh 書式 .Nm args=\`getopt Ar optstring $*\` ; errcode=$?; set \-\- $args .Sh 解説 .Nm ユーティリティは、 シェルプロシージャによって簡単に解釈できるようにコマンドライン上の オプションを切り分けます。そして、正しいオプションであるかを確かめます。 .Ar optstring は、認識されるオプション文字の文字列です ( .Xr getopt 3 を参照)。 オプション文字のあとにコロン (``:'') がある場合、そのオプションは、 (空白文字で区切られているかもしれない) 引数を持つことになります。 特別なオプション .Ql \-\- は、オプションの終りを区別するために使われます。 .Nm ユーティリティは、オプションの最後に引数として .Ql \-\- を配置します。または、それが陽に使われた時はそれを終りと認識します。 シェル変数 (\fB$1 $2\fR ...) は、個々のオプションが .Ql \- に続くように再設定されます。そして、それ自身をシェル変数にします。 各オプション引数は、同様にそれ用のシェル変数に入れられます。 .Sh 使用例 以下のコードの断片は、 引数無しの .Fl a, .Fl b オプションと、 引数ありの .Fl o オプションを取ろうとしているコマンドのために、どのようにして 引数を処理するのかを示しています。 .Pp .Bd -literal -offset indent 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"'" .Ed .Pp このコードは、以下の (コマンド指定の) 例のどれでも同じように 受け入れます。 .\"(訳注)「コマンド指定の」は、訳者が勝手に挿入している。 .\" 2.2.1R 対象(1997/04/27) Takeshi MUTOH .Pp .Bd -literal -offset indent cmd \-aoarg file file cmd \-a \-o arg file file cmd \-oarg -a file file cmd \-a \-oarg \-\- file file .Pp .Ed .Sh 関連項目 .Xr getopts 1 , .Xr sh 1 , .Xr getopt 3 .Sh 診断 .Nm ユーティリティは、 .Ar optstring 中に含まれていないオプション文字に出会った時に、 標準エラー出力にエラーメッセージを表示し、0 より大きな状態で終了します。 .Sh 歴史 Bell Labs のマニュアルを元に、 .An Henry Spencer が書きました。 振舞いは、Bell Labs 版と同じであると信じています。 使用例は .Fx バージョン 3.2 と 4.0 で変更しました。 .Sh バグ .Xr getopt 3 が持っているバグは、そのまま持っています。 .Pp 空白文字やシェルのメタキャラクタを含んだ引数は、一般に元のまま 残りません。 これは直すのは簡単に思われますが、そうではありません。 .Nm や本マニュアルの使用例を直そうとする人は、 .Fx 中のこのファイルの履歴を確認すべきです。 .Pp 不正なオプションに対するエラーメッセージは、 .Nm を実行するシェルプロシージャから返すのではなく、 .Nm から返されます。 これも直すのは困難です。 .Pp シェルオプションの値を分離すること無く、引数を指定するための .Nm set コマンドを使うためのとっても良い方法は、シェルのバージョンを 変えることです。 .Pp 引数を部分的に正しく解釈するために、 各シェルスクリプトは (前記使用例のような) 複雑なコードを持つ必要があります。 より良い getopt 的ツールは、複雑な部分の大半をツールの中に移動し、 クライアントのシェルスクリプトを単純にするものでしょう。