3

Bash で getopts を使用してオプションの引数を処理する方法を知っています

#!/bin/bash

while getopts ":a:p:drh" opt; do
  case "$opt" in
    a) echo $OPTARG;;
  esac
done

しかし、スクリプトで が必要な場合、 arg1 をスキップする./script.sh arg1 [options]ように指示するにはどうすればよいでしょうか?getopts

$ ./script.sh -a 1234
1234
$ ./script.sh arg1 -a 1234
$ ./script.sh arg1
$ ./script.sh -a 1234 arg1
1234

ご覧のとおり、引数が最後の位置に配置されている場合、引数を処理できます。getopts位置引数がオプション引数の前にあることを許可するには、どの「正規表現」が必要ですか?

オプション以外の引数を任意の順序で getopt に許可する方法からの提案は? 引数を並べ替えているようです。

4

2 に答える 2

5

これが私がそれを行う方法です。オプションではない複数の引数をどこにでも配置できます。

#!/bin/bash

while [ $# -gt 0]; do
  while getopts ":a:p:drh" opt; do
    case "$opt" in
      a) echo $OPTARG; shift;;
      p) echo $OPTARG; shift;;
      d) echo Option d;;
      r) echo Option r;;
      h) echo Option h;;
      \?) echo unknown Option;;
      :) echo missing required parameter for Option $OPT;;
    esac
    shift
    OPTIND=1
  done
  if [ $# -gt 0 ]; then
    POSITIONALPARAM=(${POSITIONALPARAM[@]} $1)
    shift
    OPTIND=1
  fi
done

echo ${POSITIONALPARAM[@]}

内側のループはパラメーターを解析します。オプション以外のパラメーターが検出されると、内側のループが終了します。外部ループは、次の非オプション パラメータを取得します。非オプション パラメータが削除された後、内側のループがピックアップされ、次のオプション パラメータの読み取りが再開されます。

Chrono Kitsuneが説明したように、shift は最初の引数 (オプションかどうかに関係なく) を削除し、すべてを 1 ポジション左に移動します。$1が削除され、 に$2なり$1、 などに$3なり$2ます。これにより、オプションではない引数が になるまで移動する制御がスクリプトに与えられます$1

shiftとリセットの両方OPTINDがこれを可能にします。OPTIND を 0 ではなく 1 にリセットするよう提案してくれたChrono Kitsuneに感謝します。

./sample.bash -a one -p two more -d sample

出力:

one
two
Option d
more sample

次に、さまざまな位置に引数を指定してスクリプトを呼び出しましょう。

./sample.bash more -a one -p two -d sample

出力:

one
two
Option d
more sample
于 2014-01-07T00:15:44.927 に答える