「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実際のファイル名かどうかを知ることができるようにすることです。

おすすめ記事