次のプログラムのbashスクリプトを作成するときに、オプションのパラメータ/フラグを含める方法は混乱します。
このプログラムには2つのパラメータが必要です。
run_program --flag1 <value> --flag2 <value>
しかし、次のようないくつかのオプションのフラグがあります。
run_program --flag1 <value> --flag2 <value> --optflag1 <value> --optflag2 <value> --optflag3 <value> --optflag4 <value> --optflag5 <value>
ユーザーパラメータを受け入れるようにbashスクリプトを実行したいと思います。ユーザーが2つのパラメータのみを順番に入力すると、次のようになります。
#!/bin/sh
run_program --flag1 $1 --flag2 $2
しかし、オプションのパラメータが含まれている場合はどうなりますか?私の考えではそうだと思います。
if [ --optflag1 "$3" ]; then
run_program --flag1 $1 --flag2 $2 --optflag1 $3
fi
しかし、3ドルの代わりに4ドルを受け取ったらどうでしょうか?
ベストアンサー1
この記事2つの異なるアプローチshift
が示されていますgetopts
(そして2つのアプローチの長所と短所について説明します)。
shift
スクリプトを使用して表示$1
、実行する操作を決定し、実行、shift
移動$2
、$1
移動$3
など$2
を実行します。
たとえば、
while :; do
case $1 in
-a|--flag1) flag1="SET"
;;
-b|--flag2) flag2="SET"
;;
-c|--optflag1) optflag1="SET"
;;
-d|--optflag2) optflag2="SET"
;;
-e|--optflag3) optflag3="SET"
;;
*) break
esac
shift
done
getopts
式で(短い)オプションを定義できますwhile
。
while getopts abcde opt; do
case $opt in
a) flag1="SET"
;;
b) flag2="SET"
;;
c) optflag1="SET"
;;
d) optflag2="SET"
;;
e) optflag3="SET"
;;
esac
done
明らかに、これは単なるコードスニペットなので、検証を省略しました。必須パラメータ flag1 と flag2 が設定されていることを確認するなどです。
どの方法を使用するかは、好みによって異なります。つまり、スクリプトの移植性が欲しいのか、短いオプション(POSIX)のみを許可するのか、長いオプション(GNU)が欲しいのかなどです。