2

是否有可能在使用这样的 shell 脚本时通过 grep 的结果:

while read line ; do
    ...
done < grep ...

谁能解释为什么这不起作用?有哪些替代方案?

谢谢!

4

2 回答 2

5

看起来您正在尝试使用进程替换

lines=5
while read line ; do
    let ++lines
    echo "$lines $line" # Number each line
    # Other operations on $line and $lines
done < <(grep ...)
echo "Total: $lines lines"

如果grep实际返回一些输出行,结果应该如下所示:

6: foo
7: bar
Total: 7 lines

这与grep ... | while ...: 在前者grep中运行在子外壳中,而在后者中,while循环在子外壳中。这通常仅在您想在循环中保留某些状态时才相关 - 在这种情况下,您应该使用第一种形式。

另一方面,如果你写

lines=5
grep ... | while read line ; do
    let ++lines
    echo "$lines $line" # Number each line
    # Other operations on $line and $lines
done
echo "Total: $lines lines"

结果将是:

6: foo
7: bar
Total: 5 lines

哎哟! 计数器被传递给子shell(管道的第二部分),但它不会返回给父shell。

于 2012-04-16T11:10:39.620 回答
3

grep是一个命令,但done < grep它告诉 shell 使用名为 grep的文件作为输入。你需要类似的东西:

grep ... | while read line ; do
    ...
done 
于 2012-04-16T10:08:39.183 回答