[英]Print all environment variables but skipping multiline variables
我想打印除某些变量以外的所有环境变量。
因此,我找到了一个关于stackoverflow的解决方案: Bash:遍历名称中包含模式的变量
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
的输出,并使用regex运算符排除变量
while read -r -d '' line; do
[[ ! $line =~ ^(SOMEVAR|SOMEOTHERVAR)= ]] && printf '%s\n' "$line"
done < <(env -0)
带有d ''
的read
命令意味着用空定界字符定界输入。 while循环运行,直到解析了最后一个定界行。
而且这只会打印所有变量,不包括您要避免的变量。 为了进一步处理每一行,您可以解析$line
变量以拆分键 / 值对,并相应地使用它。
或者,如果您打算识别包含多行字符串的任何变量,则可以使用正则表达式将其排除为
[[ ! $line =~ $'\n' ]]
您可以使用bash内置的compgen
,当与-v
选项一起使用时,它会输出所有环境变量名称,因此:
compgen -v # prints all variable names
现在,您可以轻松地在循环中使用它来排除不需要的名称和打印剩余部分:
while read var; do
echo "$var=${!var}"
done < <(compgen -v | grep -vxFE '(SOMEVAR|SOMEOTHERVAR)')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.