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

Gaj*_*jus 6 bash

我想在env打印中遍历变量:

name: ${name} value: ${value}
Run Code Online (Sandbox Code Playgroud)

由于多行值,例如,通过换行和迭代简单拆分不起作用

SERVER_TLS_SERVER_CRT=-----BEGIN CERTIFICATE-----
foo
-----END CERTIFICATE-----
Run Code Online (Sandbox Code Playgroud)

用例是解决限制传递多行变量的Docker限制--env-file.

小智 11

老线程,我知道。但对于其他需要 sh 解决方案且不支持 env 的 -0 的人:

env | while IFS= read -r line; do
  value=${line#*=}
  name=${line%%=*}
  echo "V: $value"
  echo "N: $name"
done
Run Code Online (Sandbox Code Playgroud)


anu*_*ava 9

您可以使用env -0获取空终止的name=value对列表并使用for循环进行迭代:

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

上面的脚本使用进程替换,这是一个BASH功能.在较旧的shell上,您可以使用管道:

env -0 | while IFS='=' read -r -d '' n v; do
    printf "'%s'='%s'\n" "$n" "$v"
done
Run Code Online (Sandbox Code Playgroud)

  • @langfingaz:只要 env 变量的值中没有换行符,它就会工作 (3认同)
  • 这个解决方案似乎需要GNU扩展到`env`。对于基于BSD的“ env”(例如,在Mac上),“ / usr / bin / env -0”和“ env -0”都报告“ -0”是非法选项。 (2认同)

gei*_*rha 7

这是#bash 的解决方案。

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

我最初认为这个想法是输出,因此 printf %q 是必要的,但在构建参数数组时情况并非如此,因此可以简化为:

unset IFS
args=()
for var in $(compgen -e); do
    args+=( "-e$var=${!var}" )
done
Run Code Online (Sandbox Code Playgroud)