「getopts」は、すべてのオプションがあらかじめ提供されている場合にのみ便利ですか?

「getopts」は、すべてのオプションがあらかじめ提供されている場合にのみ便利ですか?

getoptsこれが私のBashスクリプトで機能していることを確認したいと思います。しかし、何が間違っているのかわかりません。

#! /bin/bash

while getopts "a:b" opt ; do
    case $opt in
        a)
            A_OPTION="option a was given argument $OPTARG"
            ;;
        b)
            B_OPTION="option b was found"
            ;;
    esac
done
if [ -n "$A_OPTION" ] ; then echo $A_OPTION ; fi
if [ -n "$B_OPTION" ] ; then echo $B_OPTION ; fi
shift $((OPTIND - 1))
echo "The remaining arguments are: $@"

出力は次のとおりです

$ ./getopts-test foo goo -a moo -b
The remaining arguments are: foo goo -a moo -b
$ ./getopts-test -a moo -b foo goo
option a was given argument moo
option b was found
The remaining arguments are: foo goo
$ ./getopts-test -a moo foo goo -b
option a was given argument moo
The remaining arguments are: foo goo -b
$ ./getopts-test -b foo goo -a moo
option b was found
The remaining arguments are: foo goo -a moo

スクリプトがすべての場合にオプションを検出できないのはなぜですか?getoptsすべてのオプションがあらかじめ提供されており、他のパラメータと混在していない場合にのみ便利ですか?

答え1

(コメントには長すぎて回答にはあまり不便ですね)

getopt-(マイナス記号)付きの単一文字オプションとパラメータ付きオプションを検出してみてください。

(これ以上)オプションがないと(no -b、no)-a foo停止します。リスト全体を解析しません。

したがって、2番目の質問に対する答えは「はい」です。

getoptパーサーを直接作成し、引数-foo --bar(ファイル、文字列など)またはオプションを処理できます。

長い伝統は、オプションを最初に配置し、引数を後に配置して、オプションが停止する時期と-foo実際のファイル名かどうかを知ることができるようにすることです。

答え2

マンページによると、これは予想される動作です。getopts「オプション」および「オプションパラメーター」をサポートします。

手順4:すべてのオプションはで始まる必要があります-。つまり、./getopts-test foo goo -a moo -b「foo」はオプションでもなくオプション引数でもないため、機能しません。したがって、停止します。

オプションパラメータは「:」で指定されます。あなたの定義にはa:オプションパラメータがあり、これはで解析されるオプションにすぎませ-a moob。残り( )だけが残りました。-b./getopts-test -a moo -b foo goofoo goo

手順8:オプションパラメータのすべてのパラメータはコンマで区切る必要があります。そのため、./getopts-test -a moo foo goo -b構文解析のみを実行する-a mooのが正しい方法です./getopts-test -a moo,foo,goo -b。 (最後のケースにも同様に適用されます)

引用:

関連情報