m13*_*13r 3 unix bash loops environment-variables multiline
我想打印除某些变量之外的所有环境变量。
因此我在stackoverflow上找到了一个解决方案:Bash: Loop through Variables contains pattern in name
while IFS='=' read -r name value; do
if [ ! "$name" = "SOMEVAR" -a ! "$name" = "SOMEOTHERVAR" ]; then
echo "$name=$value"
fi
done < <(env)
Run Code Online (Sandbox Code Playgroud)
但是,如果我的环境变量包含换行符,则这不起作用,例如:
export SOMEVAR="some
text with
newlines"
Run Code Online (Sandbox Code Playgroud)
使用上述解决方案,它将打印:
text with=
newlines=
PWD=/home/...
...
Run Code Online (Sandbox Code Playgroud)
我还尝试使用以空结尾的字符串和多行匹配sed:
env -0 | sed -e '{N; s@SOMEVAR.*\x0@@ ; D}' | tr '\0' '\n'
Run Code Online (Sandbox Code Playgroud)
但这会切断输出,并且总是首先打印具有多行内容的变量的最后一行:
newlines
PWD=/home/...
...
Run Code Online (Sandbox Code Playgroud)
有没有办法在打印时跳过多行环境变量?
env -0您几乎已经完成了,您只需要使用读取命令和空分隔符循环遍历输出,并使用正则表达式运算符排除变量
while read -r -d '' line; do
[[ ! $line =~ ^(SOMEVAR|SOMEOTHERVAR)= ]] && printf '%s\n' "$line"
done < <(env -0)
Run Code Online (Sandbox Code Playgroud)
命令readwithd ''暗示用空定界字符对输入进行定界。while 循环一直运行,直到解析最后一个分隔行。
此外,这只是打印所有变量,不包括您想要避免的变量。为了进一步处理每一行,您可以解析变量$line以分割键/值对并相应地使用它。
或者,如果您的目的是识别任何包含多行字符串的变量,您可以使用正则表达式将其排除
[[ ! $line =~ $'\n' ]]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
973 次 |
| 最近记录: |