メッセージをエクスポートするgetopts `--`(デュアルダッシュ)を検出する

メッセージをエクスポートするgetopts `--`(デュアルダッシュ)を検出する

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

とにかく、通常必要なものよりはるかに複雑な作業を行わない限り、考慮する理由はありません。より複雑な操作を実行しても、外部で行うことを検討できます(別の区切り--文字を使用)。getoptsin 式が与えられるか、GNU Parallel が分離された引数のリストを取得する方法などがあります。find:::::::

答え2

ループが終わると、次のことgetoptsに慣れます。

shift "$((OPTIND - 1))"

残りのパラメーターは残りのパラメーターになります。 (man getopts1POSIXの例1のセクションを参照してください)。

ポイントは、説明から:

次のいずれかの状況では、オプションの終わりを識別する必要があります。最初の「--」引数がオプション引数ではないか、オプション引数ではなく「-」で始まらない引数が見つかったか、エラーが発生しました。 。


パターンがあるとしますab:。以下は4.デモです--

  1. -a x y z
    • -aバナー。残り:x y z
  2. -a -b foo x y z
    • -aフラグ+-b値= foo.rest:x y z
  3. -b foo -a -b bar x y z
    • -aフラグ+-b値= foosum.rest bar:x y z
    • 両方の値が-b渡されます。スクリプトの処理方法によって異なります。
  4. -a -b foo -- -a -b x y z
    • -aフラグ+-b値= foo.rest:-a -b x y z
  5. -a -b foo -x y z
    • 無効または不明なオプション-x
  6. -b foo bar -x y z
    • -b値 = foo.rest:bar -x y z
  7. -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

関連情報