関数引数リストで詳細レベルを設定する

関数引数リストで詳細レベルを設定する

引数を渡すbash関数を使用しています。ユーザーが特定のオプションを定義-v NUMしたかどうかをキャプチャしたいと思います--verbosity=NUM。説明どおりに定義した場合は、ローカル変数vbNUM

答え1

私が最初に言いたいのは、GNUスタイルの長いオプションを許可することが目標であると仮定すると、そのような引数を盲目的にスキャンしても詳細を指定する有効な方法がすべて見つからないことです。

ユーザーが-xyv3(と同じ-x -y -v 3)、(オプションの引数がどこにあるか--output -v2と同じ)、(オプションと見なされない場所)、または(GNUオプションスタイルの解析でサポートされている略語)を渡した場合はどうなりますか? /はオプションを正しく解析するのに役立ちます。--output=-v2-v2--outputcmd -x -- foo bar -v baz-v--verb=12getoptgetopts

ただし、適切なオプションの構文解析を気にせず、その文字列をオプションではなく引数として渡すのではなく、ユーザーが常にそのような-v/--verbosityオプションを渡すように依存できる場合は、次のようにします。

extract_verbosity() {
  unset -v REPLY
  while [ "$#" -gt 0 ]; do
    case "$1" in
      (-v)
        [ "$#" -gt 1 ] || break
        shift; REPLY=$1
      ;;
         
      (--verbosity=*)
        REPLY=${1#*=}
    esac
    shift
  done
  [ -n "${REPLY+set}" ]
}

その後、あなたの機能から:

my_function() {
  verbosity=0 # default
  extract_verbosity "$@" && verbosity=$REPLY
  ...
}

関連情報