getopts
私はという変数を使用する慣用的な方法を使用していますarg
。以下のようにオプション名をキャプチャできます。メッセージをエクスポートできるように、getoptsが「--」に達した瞬間を検出できますか?
while getopts "$shortopts" arg; do
echo "--> arg: $arg"
case $arg in
("V")
printf '%s\n' "Version"
return
;;
("u")
printf '%s\n' "Usage"
return
;;
("h")
printf '%s\n' "Help"
return
;;
esac
done
答え1
メッセージをエクスポートできるように、getoptsが「--」に達した瞬間を検出できますか?
これを行う必要はありません。
getopts
標準オプション処理を実装します。つまり、オプションでない引数が表示された場合、または引数が表示された場合は、オプションのリストを明示的に終了するオプションの--
検索を停止します。 (最初の点は、コマンドライン全体でオプションを見つけるGNU Customとは異なります。)
プログラムはMeetを気にする必要はありません--
。
つまり、getopts
位置パラメータリストが破棄されないため、その中の最後のパラメータがあるかどうかがわかります--
。
#!/bin/bash
while getopts a:bc opt; do
echo "option $opt arg $OPTARG"
done
last=
if [ "$OPTIND" -ge 2 ]; then
shift "$((OPTIND - 2))"
last=$1
shift 1
else
shift "$((OPTIND - 1))"
fi
if [ "$last" = "--" ]; then
echo "options were terminated by a double-dash (or last arg was an option-argument '--')"
fi
echo "remaining args: $*"
例えば
$ bash opts.sh -a blah -- -b foo
option a arg blah
options were terminated by a double-dash (or last arg was an option-argument '--')
remaining args: -b foo
ただし、最後の引数のみをチェックするので、オプションの区切り--
文字またはオプション引数にすることができます。--
たとえば、これは偽陽性です--
。ここに区切り文字はありません。
$ bash opts.sh -a -- foo
option a arg --
options were terminated by a double-dash (or last arg was an option-argument '--')
remaining args: foo
もちろん、独自のオプション処理を実装することもできますが、そうすると、シェルが部分文字列処理を困難にするため、少し迷惑になります。 (options引数を使用するかどうか-abc
に応じて、これを3つの異なるオプション、または1つまたは2つとして認識する必要があります。)-a
-b
とにかく、通常必要なものよりはるかに複雑な作業を行わない限り、考慮する理由はありません。より複雑な操作を実行しても、外部で行うことを検討できます(別の区切り--
文字を使用)。getopts
in 式が与えられるか、GNU Parallel が分離された引数のリストを取得する方法などがあります。find
:::
::::
答え2
ループが終わると、次のことgetopts
に慣れます。
shift "$((OPTIND - 1))"
残りのパラメーターは残りのパラメーターになります。 (man getopts
1POSIXの例1のセクションを参照してください)。
ポイントは、説明から:
次のいずれかの状況では、オプションの終わりを識別する必要があります。最初の「--」引数がオプション引数ではないか、オプション引数ではなく「-」で始まらない引数が見つかったか、エラーが発生しました。 。
パターンがあるとしますab:
。以下は4.デモです--
。
-a x y z
-a
バナー。残り:x y z
-a -b foo x y z
-a
フラグ+-b
値=foo
.rest:x y z
-b foo -a -b bar x y z
-a
フラグ+-b
値=foo
sum.restbar
:x y z
- 両方の値が
-b
渡されます。スクリプトの処理方法によって異なります。
-a -b foo -- -a -b x y z
-a
フラグ+-b
値=foo
.rest:-a -b x y z
-a -b foo -x y z
- 無効または不明なオプション
-x
- 無効または不明なオプション
-b foo bar -x y z
-b
値 =foo
.rest:bar -x y z
-b -- -a bar -x y z
-a
フラグ+-b
値=--
.rest:bar -x y z
7の場合、オプションの引数として、または--
を含む任意の文字列を持つことができます""
。
$((...))
1しかし、例では;周囲の引用符が欠落していることを確認してください。 POSIXの例ではデフォルトが含まれていると仮定していますが$IFS
、これはどの状況でも使用できないため不幸です。
答え3
getopts
ループ条件を0に初期化する変数(この場合は1)に設定します"--")
。例えば
stop=0
...
while [[ 0 -eq $stop ]] ; do
# getopts call ...
...
"--") stop=1;;r
esac
done