如何遍历所有ENV变量打印键和值?

时间:2016-09-16 10:48:50

标签: bash

我想在env打印中迭代变量:

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

由于多行值,简单地按换行和迭代分割不起作用,例如

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

用例是解决方法Docker limitation,它限制通过--env-file传递多行变量。

3 个答案:

答案 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