在bash中读取多行而不生成新的子shell?

时间:2010-03-04 00:13:11

标签: bash

我正在尝试做类似

的事情
var=0  
grep "foo" bar | while read line; do  
   var=1  
done

不幸的是,这不起作用,因为管道导致while在子shell中运行。有一个更好的方法吗?如果有另一种解决方案,我不需要使用“读取”。

我看过类似的Bash variable scope,但我无法从中得到任何结果。

2 个答案:

答案 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"