我想通过变量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