web-dev-qa-db-ja.com

コマンドラインからBashスクリプトの変数をオーバーライドする

コマンドラインからBashスクリプトの変数をどのようにオーバーライドしますか?

変数を渡す方法は知っていますが、./myscript.sh -Dvar=val

29
Derek

オーバーライドする変数にパラメーター展開を使用する必要があります。

$ 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
54
SiegeX

BashはMakeやAntとは異なります。これらの2つのプログラムでは、コマンドラインで設定されたマクロ/プロパティの値をリセットすることはできません。代わりにBashで、コマンドラインからこれらの値を設定できるようにスクリプトを記述し、スクリプト内でこれらの値をオーバーライドしないようにする必要があります。

Bashビルトインである getopts コマンドをご覧ください。これにより、コマンドライン引数を解析し、コマンドラインから値を設定するための簡単で柔軟な方法が提供されます。たとえば、OPT_AOPT_BOPT_COPT_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
12
David W.

次の構文で変数を指定する必要があります。

MYVAR=74 ./myscript.sh

スクリプト内で、設定する前に既に設定されているかどうかを確認します。

if [ ! -z $MYVAR ]; then
    #do something
fi
10
Michael Lowman

私はこのようにします:

# if Java_HOME not set, then set with default value
if [ "x$Java_HOME" = "x" ]; then
    Java_HOME=/opt/Java
fi
0
lyuboe