2017-06-07 10 views
0

コンテキスト

.configファイルを読み込む.shファイルを書き込みます。この.configファイル(私は編集できません)にはいくつかの変数があります。これらの変数が環境変数として定義されているかどうかをテストしたい。bashでvarを使って既存の環境変数をチェックする方法は?

.configファイル:

APPLICATION_PATH=/var/www/application 
MONGO_DATA_PATH=/var/lib/mongodb 
MYSQL_DATA_PATH=/var/lib/mysql 

test.shファイル:

#!/bin/sh 
if test -e ../my_folder/.config      # Test if the .config file exists 
then 
    cat ../my_folder/.config | while read line; do # Read the .config file line per line 

     env_var="${line%=*}"       # Get the part before the '=' character of the current line (e.G. APPLICATION_PATH) 
     echo $env_var        # Display the var (e.G. APPLICATION_PATH) 

                # Here, I would like to display the env var, 
                # e.G. like it would do using echo $APPLICATION_PATH 
                # but using the $env_var 

     ("echo \$$env_var")      # Throw an error 
    done 
fi 

問題

("echo \$$env_var")が可能ではないようです。

がどのように私は$env_varを使用して環境変数があるかどうかをテストすることができます

APPLICATION_PATH

./test.sh: ligne 13: echo $APPLICATION_PATH : not found

MONGO_DATA_PATH

./test.sh: ligne 13: echo $MONGO_DATA_PATH : not found

MYSQL_DATA_PATH

./test.sh: ligne 13: echo $MYSQL_DATA_PATH : not found

質問:私はtest.shを実行すると、この表示しますか?

+0

ポータブル、安全、シンプル:いずれか2つを選択します。 – chepner

+0

私は 'eval'を使うと、私は間違ったことをするだろうと私は耳を傾けましたが、私の場合は選択肢がありません。 – darckcrystale

答えて

0

あなたはここに述べた方法で使用できますので、それに応じてあなたのコードは次のように変更しますIs it possible to build variable names from other variables in bash?

を:

#!/bin/sh 
if test -e ../my_folder/.config      
then 
cat ../my_folder/.config | while read line; do 

    env_var="${line%=*}"       
    echo $env_var         
    eval "echo \$$env_var"      # This works 
done 
fi 
+0

'./test.sh:Bad substitution' – darckcrystale

+0

最初の行を"#!/ bin/sh -x "に置き換えてスクリプトを実行して、どの行がこのエラーを投げているのか確認できますか? – jayanth

+0

エラーを投げている行は 'echo $ {!env_var}'です。これは '/ bin/bash'ではなく'/bin/sh'を使っているからです。 – darckcrystale

0

あなたは移植性を犠牲にすることができた場合、あなたは間接的なパラメータ展開を使用する必要があります。可用性と正確な構文はシェルによって異なります。これは、あなたがbashでそれを行うだろうかです:

while IFS== read -r varname _; do 
    printf '%s\n' "${!varname}" 
done < ../my_folder/.config 

あなたは安全性を犠牲にしたい場合は、使用evalをするでしょう:シンプルさを犠牲にする

while IFS== read -r varname _; do 
    eval "printf '%s\n' \$$varname" 
done < ../my_folder/.config 

は、スタックオーバーフローの範囲を超えています。しかし、evalを使用する前にvarnameに有効なシェル識別子が含まれていることを確認するためにexprを使用することも可能です。

while IFS== read -r varname _; do 
    expr "$varname" : '[[:alpha:]_][[:alnum:]_]*' || continue 
    eval "printf '%s\n' \$$varname" 
done < ../my_folder/.config 
関連する問題