bash - 获取正确处理新行的环​​境变量列表

bash - get a list of environment variables with proper handling of new lines

$ export MYVAR=$(echo -e "something\nMYVAR=10")
$ env
...
MYVAR=something
MYVAR=10
...

上面的代码显示了问题。 如果您尝试使用简化版本阅读本文(很多人都这样做),您会得到错误的值。这解释了它:

$ env | while IFS== read var value; do
    [ "$var" == "MYVAR" ] && echo $value
done
someting
10

经过长时间的调查,我想知道 bashsh 是否根本无法处理这种情况。

如果我只能得到一个没有值的变量列表,我可以解决它但看起来没有外部任务(python,例如)我做不到...

问题:如何在 shell 中获取环境变量列表及其适用于上述示例的值?

查看没有名称的环境变量的一种简单方法是仅回显它(在带引号的字符串内):

$ export MYVAR=$(echo -e "something\nMYVAR=10")
$ echo "$MYVAR"
something
MYVAR=10

环境变量包含换行符后跟“MYVAR=”,使“env”的输出看起来有点奇怪,但它工作正常。

您可以使用 awk 来获取环境变量的 names

$ awk 'BEGIN {for (k in ENVIRON) { print k }}'
...

由于名称保证没有换行符,您可以将其通过管道传递到 shell 循环:

awk '...' | while read name; do
   value=${!name}
   ...
done

或者如果可能的话awk自己进行处理。

(在 bash 中,您可以使用 declare -x 获得类似于 env 产生的输出。如果有一个额外的标志可以用来获取 只有环境变量的名称。)

env 只显示导出的环境。

compgen -A variable

将为您提供所有环境变量的列表 - 包括未导出的变量。

对于其中的每一个,您都可以 运行:

typeset -p "$@"

获取完整声明。

或者你可以获得所有声明:

typeset -p

正如 choroba 指出的那样,您可以使用 env -0 :

export MYVAR="$(echo -e "something\nMYVAR=10")"

env -0 | while IFS== read -d '' -r var value; do
    [ "$var" = "MYVAR" ] && echo "$value"
done
something
MYVAR=10