我想通過變量env
打印迭代:如何遍歷所有ENV變量的打印鍵和值?
name: ${name} value: ${value}
通過簡單地換行和迭代分裂不起作用,因爲多線值,例如中,
SERVER_TLS_SERVER_CRT=-----BEGIN CERTIFICATE-----
foo
-----END CERTIFICATE-----
用例是要解決Docker limitation,其限制經由--env-file
使多行的變量。
我想通過變量env
打印迭代:如何遍歷所有ENV變量的打印鍵和值?
name: ${name} value: ${value}
通過簡單地換行和迭代分裂不起作用,因爲多線值,例如中,
SERVER_TLS_SERVER_CRT=-----BEGIN CERTIFICATE-----
foo
-----END CERTIFICATE-----
用例是要解決Docker limitation,其限制經由--env-file
使多行的變量。
下面是#bash的解決方案。
unset IFS
args=() i=0
for var in $(compgen -e); do
printf -v 'args[i++]' -e%s=%s "$var" "${!var}"
done
我最初以爲的想法是輸出,因此printf的%Q是必要的,但不是這種情況只是建立一個參數數組時,因此它可以簡化爲這樣:
unset IFS
args=()
for var in $(compgen -e); do
args+=("-e$var=${!var}")
done
您可以使用env -0
得到一個空值終止的name=value
對列表,並使用一個for循環迭代:
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
我已經看到這在另一個線程中被切斷。它給出了一個語法錯誤,''./foo.sh:line 3:語法錯誤附近的意外標記'<'\ n ./foo.sh:line 3:'done <<(env -0)''' – Gajus
是因爲你沒有使用'bash'。確保你使用'bash'來執行腳本。否則使用:'env -0 |而IFS ='='讀-r -d''n v;做printf'{「name」:「%s」,「value」:「%s」} \ n'「$ n」「$ v」;完成「,避免進程替換。 – anubhava
哦,我很傻。我一直忘記zsh。謝謝。 – Gajus