getoptを使用したオプション値のオプション

getoptを使用したオプション値のオプション

次の関数があります。これを使用してオプションの値にオプションを設定する方法を知りたいですgetopt

-wデフォルト値を使いたいです。

region -w -- "Text"

これには-w 1オプションの数値が必要です。

region -w 1 -- "Text"

ここで機能

region ()
{
  # Process command line options
  shortopts="hw::"
  longopts="help,version,warning:"

  opts=$(getopt -o "$shortopts" -l "$longopts"  \
            -n "$(basename $0)" -- "$@")
  if [ $? -eq 0 ]; then
    eval "set -- ${opts}"
    while [ $# -gt 0 ]; do
      case "$1" in
      -h|-\?|--help)
        printf "%s\n" "Todo."
        shift
        break
        ;;
      -w|--warning)
        case "$2" in
          "1") local -r warn="first";  shift 2  ;;
            *) local -r warn="all";    shift 2  ;;
         esac
         local -r f=1
         ;;
      --)
         local -r f=1
         shift
         break
         ;;
      esac
    done
  else
    shorthelp=1 # getopt returned (and reported) an error.
  fi
    
}

ベストアンサー1

おそらく、この答えは気に入らないでしょう。オプションで引数を取るオプションに引数を指定するには、スペースを使用できません。

$ getopt -o 'w::' -- -w -- arg
 -w '' -- 'arg'

$ getopt -o 'w::' -- -w 1 -- arg
 -w '' -- '1' 'arg'

$ getopt -o 'w::' -- -w1 -- arg
 -w '1' -- 'arg'

同様に、オプションの長い引数の場合は、以下を使用する必要があります。=

$ getopt -o '' -l 'warning::' -- --warning -- arg
 --warning '' -- 'arg'

$ getopt -o '' -l 'warning::' -- --warning 1 -- arg
 --warning '' -- '1' 'arg'

$ getopt -o '' -l 'warning::' -- --warning=1 -- arg
 --warning '1' -- 'arg'

マニュアルページから:

単純な短いオプションは、「-」の後に短いオプション文字が続くことです。 [...]オプションにオプションの引数がある場合オプション文字の直後に書く必要があります。存在する場合。

長いオプションは通常「--」で始まります。 [...]オプションにオプションの引数がある場合長いオプション名の直後に作成し、「=」で区切る必要があります。、存在する場合(「=」を追加し、その後に何も追加しない場合は、パラメータがないように解釈されます。これはマイナーなバグです。バグを参照してください。)


コードレイアウトのコードレビューの説明。 if-else-fi構文では、短い四半期を最初に配置してください。ここに到着したら、状況が何であるかをelse覚えるためにスキャンする必要があります。if

これにより、「アサーション」スタイルで作成し、関数の「メイン」コードを減らすことができます。

region ()
{
  # Process command line options
  shortopts="hw::"
  longopts="help,version,warning:"

  opts=$(getopt -o "$shortopts" -l "$longopts"  \
            -n "$(basename $0)" -- "$@")
  if [ $? -ne 0 ]; then
    shorthelp=1 # getopt returned (and reported) an error.
    return
  fi

  eval "set -- $opts"
  # ...

または、終了ステータスを直接確認し、まだ変数に割り当てることができます。 (ここではデフォルトの名前呼び出しも削除しました。)

  if ! opts=$(getopt -o "$shortopts" -l "$longopts" -n "${0##*/}" -- "$@")
  then
    shorthelp=1 # getopt returned (and reported) an error.
    return
  fi

-wを使用してlevel = 1を設定しました。それ以外の場合は、-wNUMにlevel = NUM​​を設定します。

  local level=0
  #...
      case "$1" in
      -w|--warning)
         level=${2:-"1"}
         ;;

つまり、${var:-default}パラメータ拡張の形式です。

おすすめ記事