我正在尝试做类似
的事情var=0
grep "foo" bar | while read line; do
var=1
done
不幸的是,这不起作用,因为管道导致while在子shell中运行。有一个更好的方法吗?如果有另一种解决方案,我不需要使用“读取”。
我看过类似的Bash variable scope,但我无法从中得到任何结果。
答案 0 :(得分:20)
如果你真的在做一些简单的事情,你甚至不需要while read
循环。以下方法可行:
VAR=0
grep "foo" bar && VAR=1
# ...
如果您确实需要循环,因为循环中正在发生其他事情,您可以从<( commands )
进程替换重定向:
VAR=0
while read line ; do
VAR=1
# do other stuff
done < <(grep "foo" bar)
答案 1 :(得分:2)
然后不要使用管道,并丢失grep
var=1
while read line
do
case "$line" in
*foo* ) var=1
esac
done <"file"
echo "var after: $var"