私はそれについての経験がありませんが、getopt
私が見たすべてのコードでプログラムパラメータを並べ替えてから、スイッチ/ケースを使用して使用されているオプションとパラメータをデコードするためにのみ使用されるため、通常は解析が必要です。 (または省略)同時にすべて。
これをやりたくないので、代わりにオプションを事前に処理し、実際に必要なときに選択した場合はどうなりますか?これと同様のものは、get_option_value -o "x:"
実際のパラメータ値またはフラグの真/偽を返します。
明らかに、これは手動で簡単に実行でき、複雑さの点で常に効率的ですが、これらの「使いやすい」機能は実際には存在すると思いますが、偶然には見つかりませんでした。
ベストアンサー1
まず、bashを使用している場合を実行してください。これはbashが何であるか、何をするかhelp getopts
についての良い概要を提供します。getopts
それ以外の場合は、getopts
シェルのマニュアルページを検索してください。
しかし、特定のオプションを検索するのではなく、次のコマンドライン引数(常に存在する)を取得することgetopts
に注意することが重要です。"$1"
オプション(およびその引数)を使用して操作を実行し、コマンドラインからそのオプションを削除することはスクリプトに依存します。
これはoptstring
検索文字列ではなく、検証文字列です。getopts
どのオプションが有効であるか、エラーメッセージを印刷するために引数を受け入れる必要があるかどうかを知らせるか、またはスクリプトがオプション処理エラーが発生したことを知って、適切なアクションを実行できます。アクション アクション。
スクリプトでいつ/場所で特定のオプションを見つけるには、他のプログラムが実行する操作を実行し、スクリプトが実行された直後にオプションを解析し、結果を変数に保存する必要があります。
つまり、やりたくないと言ったことをしなければならない。それを使いたいなら他の方法はないgetopts
。
コマンドラインから特定のオプション(およびその値)を取得するために独自のプログラムや関数を書くのを防ぐことはできませんが、誰もそうしない理由は意味がありません。ループ内のすべてのオプションを解析する方が簡単で効率的です。オプションを一時クエリに解析/検索するのではなく、一度に検索ルーチン/関数が呼び出されるたびにオプションと引数を繰り返す必要があるため、シェル関数の場合はスクリプトコピーを使用または繰り返す必要がありますgetopts
。スタンドアロンプログラムの場合は、libc関数を使用してください。"$@"
getopt()
これを行う一般的な方法は、変数をデフォルト値(存在する場合)に設定してから、各オプションを処理してオプションが表示されたときにデフォルト値を変更することです。
非常に単純な例では、xとyが引数を受け入れ、bはブールです。
x=10
y=20
b=0
while getopts "x:y:b" opt; do
case "$opt" in
x) x="$2" ; shift ;;
y) y="$2" ; shift ;;
b) b=1 ;;
esac
shift
done
echo "x=$x"
echo "y=$y"
echo "b=$b"