次のスクリプトを取得しようとしています。
-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