getopt(1) FreeBSD 一般コマンドマニュアル

getopt

前のページ 上に戻る 次のページ

getopt




解説

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


使用例

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

           args=`getopt abo: $*`
           # `getopt abo: "$@"` を使ってはなりません。
           # 以下の set コマンドとは異ったように、引き数を解釈してしまうためです。
           if [ $? != 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


バグ

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

     空白文字やシェルのメタキャラクタを含んだ引数は、一般に元のまま残りませ
     ん。これは直すのは簡単に思われますが、そうではありません。 getopt や本マ
     ニュアルの使用例を直そうとする人は、 FreeBSD 中のこのファイルの履歴を確認
     すべきです。

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

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

     引き数を部分的に正しく解釈するために、各シェルスクリプトは (前記使用例の
     ような) 複雑なコードを持つ必要があります。より良い getopt 的ツールは、複
     雑な部分の大半をツールの中に移動し、クライアントのシェルスクリプトを単純
     にするものでしょう。

FreeBSD 4.4                      April 3, 1999                     FreeBSD 4.4

ABELNET VPSサービス