コマンドラインオプションを処理するために「getopts」kshビルトインを使用しています。コマンドラインでオプションを「設定解除」するためのクリーンで標準的な方法を探しています。これがgetoptsに関する技術的な質問なのか、それともスタイル/標準に関する質問なのかはわかりません。とにかく、getopts がその引数 (デフォルトでは $*) を左から右に処理することを理解しています。これを使用して、オプションの 2 番目の指定でオプションを「オフ」にできるようにしたいと考えています。
オプション引数を取るオプションの場合、これは問題ではありません。私の getopts 処理 case ステートメントでは、「-x」オプションについて、たとえば次のように言います。
x ) x_arg=$OPTARG
;;
コマンドラインの「-x」の最後のインスタンスが勝ちます。これが私が望むものです。
問題は、オプション引数を取らないオプションで発生します。オプションが単なるスイッチ/フラグである場合、私の case ステートメントは次のようになります。
x ) x_specified=1
;;
このようなオプションでは、コマンド ラインに "-x" を追加するだけで、同じことが起こります: "x_specified=1" が再度実行されます。「x_specified の設定を解除する」ための最良/最も簡単/最も簡単/標準的な方法は何ですか? それが私の質問です。
オプション文字の前に「+」または「-」を使用できるようにする getopts 機能を呼び出したいと思っていましたが、getopts 処理ループ内で「+」または「-」のどちらが使用されたかを判断する方法がないようです。見分ける方法があれば、「+」は設定をオフにすることを意味するという基準を採用できます。私ができる他のことは次のようなものです:
x ) if [[ -z $x_specified ]] ; then
x_specified=1
else
unset x_specified
fi
;;
「-x」オプションはトグルになります。コマンドラインで表示されるたびに、設定が変更されます。ただし、コマンド ラインで「-x 設定を切り替える」だけでなく、「-x 設定をオフにする」と言う方法が必要です。オフにする方法として、「X」などの他の文字を選択することもできますが、私のスクリプトの多くは、同じ文字の大文字と小文字の両方を別の意味で使用しています。 「-xをオフにする」を意味する他のランダムな文字を選択すると、それはあまりニーモニックではなく、私のスクリプトはすでに使用方法を学ぶのに十分難しいです。
最後に、「コマンドラインで -x をオフにしたいのなら、そもそもなぜオンにするのですか?」と尋ねるかもしれません。私のスクリプトでのオプション処理は、複数ステップのプロセスを経ます。コマンドライン オプションがチェックされ、設定ファイルのオプションもチェックされます。この 2 つの間には優先順位があります。これはすべて、オプション引数を取るオプションでは正常に機能しますが、そうでないオプションではスキームが崩壊します。