getoptオプションの値を持つオプションのパラメータ

getoptオプションの値を持つオプションのパラメータ

使用中でオプションの値を持つオプションがgetoptあります。パラメータ値を指定せずに個別に一致する-l場合は、まだ1つ。どうやってこれが起こったのですか?-lshift 2shift

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

ただし、オプションのパラメータの場合は、nlwhile / caseループの前にデフォルト値に設定するか、デフォルト値にパラメータ拡張を使用する必要があります。例えば

nl="${2:-default_value}"

同じケースステートメントで短いオプションと長いオプションもテストする必要があります。それ以外の場合は、長くて短いバリアントを処理するために不必要にコードを複製します。例えば:

-l|--long) ... ;;

関連情報