我想在env
打印中迭代变量:
name: ${name} value: ${value}
由于多行值,简单地按换行和迭代分割不起作用,例如
SERVER_TLS_SERVER_CRT=-----BEGIN CERTIFICATE-----
foo
-----END CERTIFICATE-----
用例是解决方法Docker limitation,它限制通过--env-file
传递多行变量。
答案 0 :(得分:9)
您可以使用env -0
获取name=value
对的空终止列表,并使用for循环进行迭代:
while IFS='=' read -r -d '' n v; do
printf "'%s'='%s'\n" "$n" "$v"
done < <(env -0)
上面的脚本使用进程替换,这是一个BASH功能。在较旧的shell上,您可以使用管道:
env -0 | while IFS='=' read -r -d '' n v; do
printf "'%s'='%s'\n" "$n" "$v"
done
答案 1 :(得分:2)
以下是#bash的解决方案。
unset IFS
args=() i=0
for var in $(compgen -e); do
printf -v 'args[i++]' -e%s=%s "$var" "${!var}"
done
我最初认为这个想法是输出,因此printf%q是必要的,但是在构建一个arguments数组时情况并非如此,所以它可以简化为:
unset IFS
args=()
for var in $(compgen -e); do
args+=( "-e$var=${!var}" )
done
答案 2 :(得分:1)
旧线程,我知道。 但是对于其他需要 sh 解决方案且不支持 -0 env 的人:
env | while IFS= read -r line; do
value=${line#*=}
name=${line%%=*}
echo "V: $value"
echo "N: $name"
done