次のフラグとパラメータを含むコマンドがあるとします。
mycommand --foo bar arg1 arg2
(foo
このフラグの値はです"bar"
。)
しかし、foo
引数なしでフラグを提供するオプションがあるとしたらどうでしょうか。
mycommand --foo arg1 arg2
arg1
値がフラグとして扱われないようにするにはfoo
?
答え1
Unixでコマンドラインフラグを残りの引数と区別する最も一般的なイディオムは、二重ダッシュ(--
)を使用することです。
ユーティリティがCライブラリ機能をgetopt()
(直接または間接的に)使用している場合、デュアルダッシュはコマンドラインオプションの終わりを示し、getopt()
コマンドライン解析を終了します。
これはから来たものですgetopt(3)
手動OpenBSDから:
引数リストのオプション解釈は、「--」(二重ダッシュ)オプションを使用して抑制できます。これはgetopt()が引数処理終了信号を送り、-1を返すようにします。
そのため、名前付きファイルを削除する正しい方法は次のとおり-f
です。
$ rm -- -f
例えば。
getopts
シェルはこのライブラリ関数を呼び出して組み込みコマンドを実装する可能性が高いです。
getopts
IMHO、シェルスクリプトとgetopt()
Cプログラムでこれを使用する方法を知っておくとよいでしょう。あまり難しくなく、プロジェクトのコマンドライン解析コードを書くと、作業がはるかに簡単になります。
getopt_long()
一部のCライブラリは、--option=value
「長いオプション」()を解析する機能も提供しています。しかし、これは拡張です(愚かな意図ではありません)。
答え2
次のことを検討してください。
mycommand --foo=bar arg1 arg2
=<someval>
フラグに値を割り当てる際の要件は、これを明確にします。
明らかに、これは値が指定されていない別のケースです。
mycommand --foo arg1 arg2
答え3
これに対する一般的な答えはありません。それはすべてmycommand
その主張がどのように解釈されるかに依存します。たとえば、引数の値として決して表示されない限られた数の値のみを許可すると、あいまいさが明確になり、mycommand
次のコマンドライン引数が許容可能な値であることを確認して、省略された値を簡単に検出できます。foo
foo
foo