打印所有环境变量,但跳过多行变量

时间:2019-06-17 14:24:55

标签: bash loops unix environment-variables multiline

我要打印除某些变量以外的所有环境变量。

因此,我找到了一个关于堆栈溢出的解决方案:Bash: loop through variables containing pattern in name

while IFS='=' read -r name value; do
    if [ ! "$name" = "SOMEVAR" -a ! "$name" = "SOMEOTHERVAR" ]; then
        echo "$name=$value"
    fi
done < <(env)

但是,如果我的环境变量包含换行符,则此操作不起作用,例如:

export SOMEVAR="some
text with
newlines"

使用上述解决方案,它将打印:

text with=
newlines=
PWD=/home/...
...

我还尝试使用以空值结尾的字符串和多行匹配(与sed

env -0 | sed -e '{N; s@SOMEVAR.*\x0@@ ; D}' | tr '\0' '\n'

但是这会切断输出,并始终首先打印具有多行内容的变量的最后一行:

newlines
PWD=/home/...
...

在打印多行环境变量时有什么方法可以跳过吗?

2 个答案:

答案 0 :(得分:2)

您几乎已经拥有了它,您只需要使用读取命令和空定界符遍历env -0的输出,并使用正则表达式运算符排除变量即可。

while read -r -d '' line; do 
    [[ ! $line =~ ^(SOMEVAR|SOMEOTHERVAR)= ]] && printf '%s\n' "$line" 
done < <(env -0)

带有read的{​​{1}}命令意味着用空分隔符分隔输入。 while循环运行,直到解析了最后一个定界行。

这也只是打印所有变量,不包括您要避免的变量。为了进一步处理每一行,您可以解析d ''变量以拆分 key / value 对,并相应地使用它。

或者如果您打算识别包含多行字符串的任何变量,则可以使用正则表达式将其排除为

$line

答案 1 :(得分:1)

您可以使用内置的bash compgen,当与-v选项一起使用时,它会输出所有环境变量名称,因此:

compgen -v # prints all variable names

现在,您可以轻松地在循环中使用它来排除不需要的名称和打印剩余部分:

while read var; do
   echo "$var=${!var}"
done < <(compgen -v | grep -vxFE '(SOMEVAR|SOMEOTHERVAR)')