getoptsが2番目の引数と一致しません。

getoptsが2番目の引数と一致しません。

次のスクリプトを取得しようとしています。

  • -qオプションを使用して変数を設定する
  • オプションのヘルプ表示-h
  • 他のオプションは失敗します-*が、位置引数は許可されます。

これはgetopts私が使用するスニペットです。

while getopts qh opt; do
    case "${opt}" in
        q)
            quiet="true"
            ;;
        h)
            usage
            exit 1
            ;;
        \?)
            echo "unrecognized option -- ${OPTARG}"
            exit 1
            ;;
    esac
    shift
done

echo "unparsed: $*"

これはとても簡単なようです。ただし、単一のパラメータを指定した場合、またはa.sh -q予想a.sh -hされる操作を実行した場合にのみ機能します。

ただし、2つの引数を指定したり、$ 2に認識できない引数を指定したりすると、何もしません。

$ ./a.sh -b
unrecognized option -- b

$ ./a.sh -q -b
unparsed: -b

$ ./a.sh -h -k
this is my help message
unparsed: -k

なぜ2番目のパラメータ($ 2)がgetoptsループで処理されないのですか?

ベストアンサー1

コマンドがshift無効です。しなければならない外部円形while。努力する:

while getopts :qh opt; do
    case "${opt}" in
        q)
            quiet="true"
            ;;
        h)
            usage
            exit 1
            ;;
        \?)
            echo "unrecognized option -- ${OPTARG}"
            exit 1
            ;;
    esac
done
shift $((OPTIND - 1))

echo "unparsed: $*"

はい

コードの先頭に次の行を追加すると:

usage() { echo "this is my help message"; }

その後、次のテストを実行できます。

$ ./a.sh -q -foo
unrecognized option -- f
$ ./a.sh -q -h
this is my help message

おすすめ記事