スポンサーリンク

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

名称

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

書式

args=`getopt optstring $*` ; errcode=$?; set −− $args

解説

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

使用例

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

      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

関連項目

getopts(1), sh(1), getopt(3)

診断

getopt ユーティリティは、 optstring 中に含まれていないオプション文字に出 会った時に、標準エラー出力にエラーメッセージを表示し、0 より大きな状態で 終了します。

歴史

Bell Labs のマニュアルを元に、 Henry Spencer が書きました。振舞いは、Bell Labs 版と同じであると信じています。使用例は FreeBSD バージョン 3.2 と 4.0 で変更しました。

バグ

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

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

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

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

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

FreeBSD 10.0 April 3, 1999 FreeBSD 10.0

スポンサーリンク