メッセージをエクスポートする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:::::::

おすすめ記事