2016-09-16 8 views
1

私はenv印刷中の変数を反復処理したいと思います:キーと値を印刷するすべてのENV変数を反復処理する方法は?

name: ${name} value: ${value} 

は単に改行と反復により分割することは、例えば、理由は複数行の値を、動作しません。

SERVER_TLS_SERVER_CRT=-----BEGIN CERTIFICATE----- 
foo 
-----END CERTIFICATE----- 

ユースケースは--env-file介してマルチライン変数を渡す制限Docker limitationを回避することです。

答えて

1

#bashからの解決策は次のとおりです。

unset IFS 
args=() 
for var in $(compgen -e); do 
    args+=("-e$var=${!var}") 
done 
3

あなたがnullを取得するためにenv -0を使用することができますがname=valueペアのリストを終了し、反復処理するループのために使用します。

while IFS='=' read -r -d '' n v; do 
    printf "'%s'='%s'\n" "$n" "$v" 
done < <(env -0) 

スクリプト上BASH機能ですプロセス置換を、使用しています。古いシェルでは、パイプラインを使用することができます。

env -0 | while IFS='=' read -r -d '' n v; do 
    printf "'%s'='%s'\n" "$n" "$v" 
done 
+0

私は:%qが必要でしたが、ちょうどarguments配列を構築する際にそれがケースではありませんので、それはこのように単純化することができますprintfの私が最初にそれゆえ、アイデアは出力に思った

unset IFS args=() i=0 for var in $(compgen -e); do printf -v 'args[i++]' -e%s=%s "$var" "${!var}" done 

これが別のスレッドで切り取られているのを見ました。 '' ./foo.sh:予期しないトークンの近くで構文エラーが発生しました。 '<' \ n ./foo.sh:3行目: 'done <((env -0)​​ ')' ' – Gajus

+0

あなたが 'bash'を使っていないからです。あなたのスクリプトを実行するために 'bash'を使用していることを確認してください。あるいは、次のようにします。 'env -0 | IFS = '=' read -r -d '' n v; \ n "" $ n "" $ v "; printf '{" name ":"%s "、" value ":"%s "}プロセスの置換を回避する「完了」となる。 – anubhava

+1

ああ愚かな私。私はzshを忘れています。ありがとうございました。 – Gajus

関連する問題