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
经过长时间的调查,我想知道 bash
或 sh
是否根本无法处理这种情况。
如果我只能得到一个没有值的变量列表,我可以解决它但看起来没有外部任务(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
$ 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
经过长时间的调查,我想知道 bash
或 sh
是否根本无法处理这种情况。
如果我只能得到一个没有值的变量列表,我可以解决它但看起来没有外部任务(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