2016-07-08 10 views
1

私は変数を設定ファイルから読み込みます。ファイルはこのようになっていること、例えば、言う:それは、変数名$cfg1$cfg2を持つことになりますので、bash:変数の値が既存の変数の名前であることを確認してください

cfg1=hello 
cfg2=there 

私のスクリプトは、それを読み込みます。コマンドライン引数が定義済みの変数のいずれかと一致するかどうかを確認したい。つまり、script.sh cfg1を実行するとif文が渡されますが、script.sh cfg3を実行すると失敗します。

私は\$$varnameの構文を知っていますが、正直なところ、どのように動作するのか分かりません。私は試しました:

if [[ \$$1 ]] 

しかし、それはいつも通りです。

答えて

3

bash 4.2以降で-vテストを使用します。

if [[ -v $1 ]]; then 
    echo "Variable $1 is defined" 
else 
    echo "Variable $1 is not defined" 
fi 

@choroba's answerは、以前のバージョン1で動作するはず使用される可能性が高いです。

+1

'-v'について教えてください。潜在的な混乱を避けるために、 '-v $ 1'は完全にここで動作します。なぜなら' $ 1'の_value_はテスト対象の変数の_name_です。 これとは対照的に、 '$ 1' _itself_が渡されたかどうかをテストするのに' -v $ 1'と '-v 1'のどちらも使わないでください(' $# 'を調べてください)。 – mklement0

5

あなたはパラメータ展開を使用することができます。変数が定義されている場合

#!/bin/bash 

cfg1=hello 
cfg2='' 

for varname in cfg{1..3} ; do 
    echo $varname 
    if [[ ${!varname+1} ]] ; then 
     echo ok 
    fi 
done 
  • +11で値を置き換えます。
  • !は、可変インダイレクションを導入します。つまり、変数$varnameが変数の名前として使用されます。
関連する問題