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

标签 bash loops unix environment-variables multiline

我想打印除某些变量之外的所有环境变量。

因此我在stackoverflow上找到了解决方案: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/...
...

我还尝试使用以 null 结尾的字符串和与 sed 进行多行匹配:

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

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

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

有没有办法在打印时跳过多行环境变量?

最佳答案

您几乎已经完成了,您只需要使用读取命令和空分隔符循环遍历 env -0 的输出,并使用正则表达式运算符排除变量

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

带有 d ''read 命令意味着用空分隔符来分隔输入。 while 循环一直运行,直到解析最后一个分隔行。

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

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

[[ ! $line =~ $'\n' ]] 

关于bash - 打印所有环境变量但跳过多行变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56633343/

相关文章:

MySQL游标两次获取相同的结果

php - PHP“for循环”上传到数据库

linux - 将日志文件从一种时间格式批量重命名为另一种时间格式

linux - 如何 tar fifo

bash - 使用 os.system 正确处理从 Python 转义的 shell

loops - 为什么内循环收集不返回结果?

windows - Unix/Windows 脚本帮助 : pass command line parameter from Windows to Unix

html - Unix Shell 中的 CSS 样式覆盖

java - Windows 上的 "lo"接口(interface)等效项是什么

bash - 使用 expect 使 2 个脚本相互交互自动化