2012-07-27 33 views
29

私は環境変数が設定されているかどうかを確認する必要があるシェルスクリプトを作成しています。環境変数がすでに設定されているかどうかにかかわらず、シェルスクリプトをチェックする方法はありますか?環境変数が既に設定されているかどうかを確認してください。

+0

実際には、これはその質問の真の複製ではありません。ここでのOPは、スクリプトを終了する代わりに、変数が設定されているかどうかを知りたい場合、その場合、$ {V :?}は有効な答えではありません。 'set | grep -q '^ V =' 'はです。これは変数の存在をテストし、変数が設定されていても空文字列になっていても機能します。 – Coroos

答えて

27
[ -z "$VARIABLE" ] && VARIABLE="abc" 

if env | grep -q ^VARIABLE= 
then 
    echo env variable is already exported 
else 
    echo env variable was not exported, but now it is 
    export VARIABLE 
fi 

私はあなたがVARIABLEを持つことができますが、それが輸出されていなかったので[ -z $VARIABLE ]が、十分ではないことを強調したいです。つまり、環境変数ではありません。

+0

これはすべてのシェル環境で動作しますか? – Mojoy

+0

@Senthilnathan:もちろん、このpeacofコードを移植性の高いものにするために書き換えられる唯一のものは 'grep -q'です。 'env |代わりにgrep^VARIABLE =>/dev/null'を実行してください。 –

+0

変数をエクスポートしてエクスポートせずに変数を設定すると、エクスポートされていない変数とエクスポートされた変数の不一致に終わるのですか、エクスポートされた変数も自動的に更新されますか? – ArtOfWarfare

7
if [ -z "$VARIABLE" ]; then 
    VARIABLE=... 
fi 

これは、$ VARIABLEの長さがゼロであるかどうかをチェックします。

13

何がやりたいことはbashのではネイティブで、それが呼ばれるパラメータ置換:変数が設定されていない場合は

VARIABLE="${VARIABLE:=abc}" 

は、右手側はABCと同じになります。内部演算子:=は次のものに置き換えることができます。 - 変数が設定されていないか空でないかどうかをテストします。

+0

まさに私が探していたものです。 'export TEST_DATABASE_NAME =" $ {TEST_DATABASE_NAME:= prodlike} "行は、TEST_DATABASE_NAMEがまだ定義されていない場合にのみ、prodlikeをデフォルトとして使用します。厄介な条件ブロックはありません。 1行のコードですべて。 –

46

、条件(環境中か否か)変数を割り当てるための標準的な溶液である:それは未設定である場合にのみ値「FOO」にVARをセットする

: ${VAR=foo} 

: ${VAR:=foo} 

は、環境の中でVARを入れてフォローアップする:

export VAR 

あなたはまた、行うことができますexport VAR=${VAR-foo} VARが未設定または空の文字列、使用された場合
は、VARに "foo" を設定するにはまたはexport VAR=${VAR:=foo}ですが、一部の古いシェルでは、同じ行に代入と書き出しの構文がサポートされていません。また、DRY; =オペレータの両側の名前を使用することは不要な繰り返しです。 (変数をエクスポートする2行目は、同じプリンシパルに違反しますが、より良い感じです)。

変数が環境内にあるかどうかを判断することは一般的には非常に困難です。 envの出力を解析することはできません。考えてみましょう:

export foo=' 
VAR=var-value' 
env | grep VAR 

また、それはサブシェルとテストを起動するために動作します:

sh -c 'echo $VAR' 

VARはVARは、環境にあることの指標となりサブシェルに設定されることを示すであろうと現在のプロセスですが、単にサブシェルの初期化でVARが設定されている可能性があります。しかし、機能的には、VARが環境にある場合と同じ結果になります。幸いにも、VARが環境にあるかどうかは、通常は気にしません。あなたがそこにそれを必要とするなら、そこに置く。それが必要な場合は、取り出してください。

+0

':$ {VAR:= foo}'表記が内部的にどのように動作するかについての説明を追加できますか?私はいつもそれを解決策と見なしますが、実際にはそれが実際には機能しません。 –

+1

私は[StackOverflow](http://stackoverflow.com/questions/4437573/bash-assign-default-value)に関するいくつかの説明を見つけました! –

関連する問題