これが私がそれを行う方法です。オプションではない複数の引数をどこにでも配置できます。
#!/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