2016-04-06 5 views
1

すべての環境変数を読み込んだシェルスクリプトを作成しようとしています。その中で変数を使用し、評価後に再エクスポートします。各環境変数を評価し、ubuntuに戻す

- 私は、環境変数は次のように公開しました:

echo $JVM_OPTS     
-Djava.awt.headless=true -Xmx1600m -Djava.rmi.server.hostname=${CONTAINER_IP} -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Duser.language=en -Duser.country=US -XX:+HeapDumpOnOutOfMemoryError -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:+CMSIncrementalPacing -XX:CMSIncrementalDutyCycleMin=0 


echo $CONTAINER_IP 
10.44.214.63 

は今、私はevalの "JVM_OPTS" 変数とに$ JVM_OPTSに$ {CONTAINER_IP}の値を代入する必要があります10.44.214.63。最後に、この評価値をJVM_OPTS変数に戻します。

サンプル出力:

echo $JVM_OPTS     
    -Djava.awt.headless=true -Xmx1600m -Djava.rmi.server.hostname=10.44.214.63 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Duser.language=en -Duser.country=US -XX:+HeapDumpOnOutOfMemoryError -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:+CMSIncrementalPacing -XX:CMSIncrementalDutyCycleMin=0 

私の分析これまで: 私は仕事

#!/bin/bash 

for path in $(printenv); do 
    path=`eval echo $path` 
    echo $path 
done 

printenvのは全体のenvを与えるだろう行うには、以下のコードを書きました。変数と値を指定します。私はちょうど名前が必要とし、値を使用します。

これを行うには?

+1

ここで「/ JVM_OPTS」はいつ割り当てられますか? 'JVM_OPTS'が代入される前に' CONTAINER_IP'を設定するだけでは大丈夫ですか? –

+0

いいえ、実際にCONTAINER_IPがDockerの実行に引数として送信されています。 Dockerのコンパイル時に変数JVM_OPTSが設定されています。 実行時まで、私はCONTAINER_IPの値を知らないでしょう。 –

+0

イメージ作成時に残りの値が設定されていても、ブート時に 'CONTAINER_IP '値を使って' JVM_OPTS'をあらかじめ設定しておくことができます。 –

答えて

2

for path in $(compgen -e) ; do 
    eval "$path=\"${!path//\"/\\\"}\"" 
done 

を試してみてください。しかしevalを使用しての落とし穴については、Why should eval be avoided in Bash, and what should I use instead?を参照してください。

compgen -eは、環境変数のリストを出力します。

${!path}は、名前が$pathである変数の値を評価します。

//\"/\\\"は、可変値の\"をと置き換えて、埋め込み二重引用符を保持します。