コマンドラインからBashスクリプトの変数をどのようにオーバーライドしますか?
変数を渡す方法は知っていますが、./myscript.sh -Dvar=val
。
オーバーライドする変数にパラメーター展開を使用する必要があります。
$ cat override.sh
#!/bin/bash
: ${var1:=foo} # var1 will take on the value "foo" if not overridden
var2=${var2:-foo} # same thing but more typing
echo "var1 is $var1 | var2 is $var2"
$ ./override.sh
var1 is foo | var2 is foo
$ var1=bar var2=baz ./override.sh
var1 is bar | var2 is baz
BashはMakeやAntとは異なります。これらの2つのプログラムでは、コマンドラインで設定されたマクロ/プロパティの値をリセットすることはできません。代わりにBashで、コマンドラインからこれらの値を設定できるようにスクリプトを記述し、スクリプト内でこれらの値をオーバーライドしないようにする必要があります。
Bashビルトインである getopts コマンドをご覧ください。これにより、コマンドライン引数を解析し、コマンドラインから値を設定するための簡単で柔軟な方法が提供されます。たとえば、OPT_A
、OPT_B
、OPT_C
、OPT_D
という4つの変数があります。パラメータを渡さない場合、デフォルト値が取得されます。ただし、コマンドラインでそのデフォルト値をオーバーライドできます。
USAGE="$0 [-a <a> -b <b> -c <c> -d <d>]"
OPT_A="Default Value of A"
OPT_B="Default Value of B"
OPT_C="Default Value of C"
OPT_D="Default Value of D"
while getopts ':a:b:c:d:' opt
do
case $opt in
a) OPT_A=$OPTARG;;
b) OPT_B=$OPTARG;;
c) OPT_C=$OPTARG;;
d) OPT_D=$OPTARG;;
\?) echo "ERROR: Invalid option: $USAGE"
exit 1;;
esac
done
環境変数をエクスポートして、Bashスクリプトがそれらにアクセスできるようにすることもできます。そうすれば、変数を設定してその値を使用できます。
Bashでは、${parameter:=Word}
コンストラクトは、$parameter
が設定されている場合、$parameter
の値を使用することを示しています。ただし、$parameter
がヌルまたは未設定の場合は、代わりにWord
を使用します。
今、あなたがこれをしたと想像してください:
$ export COMMANDLINE_FOO="FUBAR"
これで、変数$ COMMANDLINE_FOOが設定され、シェルスクリプトで読み取り可能になりました。
次に、シェルスクリプトでこれを実行できます。
FOO=BARFU
[...] #Somewhere later on in the program...
echo "I'm using '${COMMANDLINE_FOO:=$FOO}' as the value"
これで印刷されます
I'm using 'FUBAR' as the value
の代わりに
I'm using 'BARFU' as the value
次の構文で変数を指定する必要があります。
MYVAR=74 ./myscript.sh
スクリプト内で、設定する前に既に設定されているかどうかを確認します。
if [ ! -z $MYVAR ]; then
#do something
fi
私はこのようにします:
# if Java_HOME not set, then set with default value
if [ "x$Java_HOME" = "x" ]; then
Java_HOME=/opt/Java
fi