コードのコマンドライン解析ビットを記述するとき、どのオプションが引数を使用し、どのオプションが引数を使用しないかを指定します。たとえば、-h
オプション(たとえばヘルプ)と-a
引数を取るオプションを受け入れるシェルスクリプトでは、次のようにします。
opt_h=0 # default value
opt_a=""
while getopts 'a:h' opt; do
case $opt in
h) opt_h=1 ;;
a) opt_a="$OPTARG" ;;
esac
done
echo "h: $opt_h"
echo "a: $opt_a"
a:h
ビットが「私は2つのオプションを解析するために期待してい、と言う-a
と-h
、および-a
引数取る必要があります」(それはだ:
後a
、パーサー伝え-a
引数を取りますが)。
したがって、オプションが終了する場所、その値が開始する場所、およびその後に別のオプションが開始する場所にあいまいさはありません。
実行する:
$ bash test.sh -h -a hello
h: 1
a: hello
$ bash test.sh -h -ahello
h: 1
a: hello
$ bash test.sh -hahello
h: 1
a: hello
これが、ほとんどの場合、オプションを解析するための独自のコマンドラインパーサーを書くべきではない理由です。
この例では、注意が必要なケースは1つだけです。解析は、通常、最初の非オプションで停止しますので、コマンドライン上のものを持っているとき、そのルックスのオプションのように:
$ bash test.sh -a hello -world
test.sh: illegal option -- w
test.sh: illegal option -- o
test.sh: illegal option -- r
test.sh: illegal option -- l
test.sh: illegal option -- d
h: 0
a: hello
以下はそれを解決します:
$ bash test.sh -a hello -- -world
h: 0
a: hello
--
信号、コマンドラインオプションの終わり、および-world
ビットは、それが(それは位置変数の一つにあります)を望んでいるものは何でもするプログラムのために残されています。
つまり、ファイル名の先頭にが付いているダッシュを含むファイルを削除する方法ですrm
。
編集:
C呼び出しgetopt()
(で宣言unistd.h
)で記述されたユーティリティは、ほぼ同じ方法で動作します。実際、私たちが知る限り、このbash
関数getopts
はCライブラリ関数の呼び出しを使用して実装できますgetopt()
。Perl、Python、および他の言語には、同様のコマンドライン解析ライブラリがあり、ほとんどの場合、同様の方法で解析を実行します。
これらgetopt
およびgetopt
-likeライブラリルーチンの一部は、「長い」オプションも処理します。通常、これらの前には二重ダッシュ(--
)が付き、引数を取る長いオプションは、等号の後にしばしば続きます。たとえば--block-size=SIZE
、du
ユーティリティの[一部の実装]オプション(-B SIZE
同じものを指定することもできます)。
マニュアルが短いオプションとその引数の間のスペースを示すためにしばしば書かれている理由は、おそらく読みやすさのためです。
編集:やユーティリティなどの本当に古いツールには、ダッシュなしのオプションがあります。これは、純粋に歴史的な理由と、まさにその方法で動作するためにそれらに依存するソフトウェアとの互換性を維持するためです。このユーティリティは、最近ではダッシュ付きのオプションを選択できるようになりました。BSDマニュアルでは、「バンドルフラグ」の古いスタイルのオプションを呼び出しています。dd
tar
tar
tar