2016-08-20 3 views
0

以下のように、変数の存在をbashでチェックしたいと思います。bashで変数のエイリアスを作成できますか?

if [ -z "$VARIABLE" ]; then 
    echo "VARIABLE does not exist" 
else 
    echo "VARIABLE exist" 
fi 

正常に動作します。しかし、次のステップでは、変数名を生成し、変数名を持つ変数が存在するかどうかを次のようにチェックします。

function generate_var_name() { echo "aaa" } 

VARIABLE_NAME=$(generate_var_name) 
if [ -z ${$VARIABLE_NAME:-""} ]; then # This give error message below. 
    echo "VARIABLE does not exist" 
else 
    echo "VARIABLE exist" 
fi 

ただし、動作しませんでした。そのエラーメッセージが

再び
${"$INCLUD_GUARD_NAME":-""}: bad substitution 

だった、私がやりたいことは (1)変数名、nameAを生成し、別の変数、VARBにそれを保管しています。 (2)変数varBを使用して、変数nameAを持つ変数が存在するかどうかを確認します。

解決策や提案をお持ちの方は教えてください。

ありがとうございました。

+0

'変数が存在するかどうかをテストしません-z'を。その展開が空文字列かどうかをテストします。変数がまったく設定されているかどうかをテストするには '[-v VARIABLE]'を使います。 – chepner

答えて

3

間接的な変数の拡張が必要な​​ようです。また、条件が条件の逆になっているようです。

export aaa=foobar 
VARIABLE_NAME=aaa 

if [ -n "${!VARIABLE_NAME}" ]; then 
    echo "VARIABLE exist" 
else 
    echo "VARIABLE does not exist" 
fi 

更新:@chepnerが正しく指摘したように、上記のテストは、実際に変数が定義されているかどうかをチェックしませんが、むしろ変数が空の文字列に評価されるかどうか。このチェックは、定義されていない変数と、空の文字列に相当する変数を定義することを目的とする場合にのみ機能します。変数の正しい存在チェックについては、@ chepnerの答えをご覧ください。

+0

ありがとう、merlin2011。あなたが言いたい変数名としての拡張は、私が望むものでした。ありがとうございました。 – mora

+1

Plus1。また、レコードのためだけに、配列にアクセスさせたい場合は、次のようにする必要があります: 'var = 'aaa [3]'; value = "$ {!var}" 'ではなく、' var = 'aaa'; value = "$ {!var [3]}" '... – anishsane

+1

変数が空でない値を持っているかどうかをテストします。 – chepner

1

bashはすでに変数の存在のためのテストがあります。

foo=3 # non-empty value 
bar= # empty value 
# baz is not set 
for v in foo bar baz; do 
    if [[ -v $v ]]; then 
     echo "$v is set; its value is ${!v}" 
    else 
     echo "$v is not set" 
    fi 
done 
+0

ありがとう、私に事前の技術を与えるためのchepner。あなたが私に[[]]のオプションを学ぶ方法を教えてもらえますか?私は[[]]を検索しましたが、主にマッチングのためにいくつかの情報を得ることができましたが、あなたが提供した十分な情報を得ることができませんでした。ありがとうございました。 – mora

+1

''条件式 'の 'man bash'をチェックしてください。 – chepner

+0

もう一度ありがとう、chepner。私はそれを得ることができた。 – mora

関連する問題