使用中でオプションの値を持つオプションがgetopt
あります。パラメータ値を指定せずに個別に一致する-l
場合は、まだ1つ。どうやってこれが起こったのですか?-l
shift 2
shift
opts=$( getopt -o "$shortopts" -l "$longopts" -n "${0##*/}" -- "$@" )
eval "set -- ${opts}"
while (( $# > 0 )); do
case $1 in
("-l")
case "$2" in
(+([[:digit:]]))
# matches -lNUM, optional argument value
nl="$2"; shift 2 ;;
(*)
# matches -l, no argument value provided
nl=1 ; shift ;;
esac
;;
("--") shift ; break ;;
(*) opt_error=1 ; break ;;
esac
done
答え1
man getopt
そのセクションの下を見ると、OUTPUT
次の内容が表示されます。
オプションがオプションの引数を取り、引数が見つからない場合は、次の引数が生成されますが、引用モードでは空ですが、引用符ではない(互換性)モードでは2番目の引数は生成されません。
これは、(互換モードで実行せず、レガシー以外のスクリプトに対してそれを行う理由がほとんどない場合)、パラメータがオプションに対して空であるか、オプションの値getopt
として生成および追加されることを意味します。オプションの直後のパラメータリストに追加されます。
つまり、オプションの後には常に引数があるので、常に必要ですshift 2
。
ただし、オプションのパラメータの場合は、nl
while / caseループの前にデフォルト値に設定するか、デフォルト値にパラメータ拡張を使用する必要があります。例えば
nl="${2:-default_value}"
同じケースステートメントで短いオプションと長いオプションもテストする必要があります。それ以外の場合は、長くて短いバリアントを処理するために不必要にコードを複製します。例えば:
-l|--long) ... ;;