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