在POSIX sh中循环环境变量

Jus*_*ard 3 unix environment-variables sh

我需要遍历环境变量,并在POSIX sh(而不是bash)中获取它们的名称和值。到目前为止,这就是我所拥有的。

#!/usr/bin/env sh

# Loop over each line from the env command
while read -r line; do
  # Get the string before = (the var name)
  name="${line%=*}"
  eval value="\$$name"

  echo "name: ${name}, value: ${value}"
done <<EOF
$(env)
EOF
Run Code Online (Sandbox Code Playgroud)

它大部分时间都可以工作,除非环境变量包含换行符。在这种情况下,我需要它来工作。

我知道用nul而不是换行符分隔变量的-0标志env,但是如果使用该标志,如何遍历每个变量? 编辑:@chepner指出POSIX env不支持-0,所以可以了。

只要使用POSIX sh,任何使用可移植linux实用程序的解决方案都是好的。

che*_*ner 5

无法env完全自信地解析的输出。考虑以下输出:

bar=3
baz=9
Run Code Online (Sandbox Code Playgroud)

我可以在两种不同的环境下生产这种产品:

$ env -i "bar=3" "baz=9"
bar=3
baz=9
$ env -i "bar=3
> baz=9"
bar=3
baz=9
Run Code Online (Sandbox Code Playgroud)

是两个环境变量bar和和baz,具有简单的数字值,还是一个bar具有值的变量$'3\nbaz=9'(使用bashANSI引用样式)?


您可以放心地使用POSIX访问环境awk,但是,使用ENVIRON数组。例如:

awk 'END { for (name in ENVIRON) {
            print "Name is "name;
            print "Value is "ENVIRON[name];
           }
         }' < /dev/null
Run Code Online (Sandbox Code Playgroud)

使用此命令,您可以区分上述两种环境。

$ env -i "bar=3" "baz=9" awk 'END { for (name in ENVIRON) { print "Name is "name; print "Value is "ENVIRON[name]; }}' < /dev/null
Name is baz
Value is 9
Name is bar
Value is 3
$ env -i "bar=3
> baz=9" awk 'END { for (name in ENVIRON) { print "Name is "name; print "Value is "ENVIRON[name]; }}' < /dev/null
Name is bar
Value is 3
baz=9
Run Code Online (Sandbox Code Playgroud)