我在将命令的输出以bash的形式read
循环中遇到了一个小问题,因此我一次只能处理一行的命令。循环的内容似乎正在执行其工作,但是退出循环时,不会设置我在循环内部设置的所有变量。我已将代码简化为以下内容:
#!/bin/bash
set -x
printf '1\n2\n3\n' |
while read -r line; do
if [[ $line == "1" ]]; then
var="read the line"
fi
done
echo "var=${var-NOTSET}"
启用调试器后,将产生以下输出
+ printf '1\n2\n3\n'
+ read -r line
+ [[ 1 == \1 ]]
+ var='read the line'
+ read -r line
+ [[ 2 == \1 ]]
+ read -r line
+ [[ 3 == \1 ]]
+ read -r line
+ echo var=NOTSET
var=NOTSET
您可以看到var
已在循环内设置,但不再在循环外设置。这是子问题吗?我到处都看过这种类型的读取循环,而且看来,如果您不能以这种方式设置变量,那么它就不是有用的设计模式。
以下代码确实按照我期望的方式工作,但是当然,它创建了一个我不想创建的无用的临时文件。
#!/bin/bash
set -x
TMPFILE="/tmp/abcdef"
printf '1\n2\n3\n' > $TMPFILE
while read -r line; do
if [[ $line == "1" ]]; then
var="read the line"
fi
done < "$TMPFILE"
echo "var=${var-NOTSET}"