bash中嵌套循环的奇怪行为

时间:2013-05-28 21:52:02

标签: bash loops while-loop nested io-redirection

我想知道为什么这个bash脚本

#!/bin/bash
seq 1 3 > foo
COUNT=0
while read VAR1; do
    while read VAR2; do
        let COUNT++
        echo -n $COUNT
    done < foo
done < foo

输出:123456789

而这个其他bash脚本,那个(AFAIK)应该做同样的事情

#!/bin/bash

seq 1 3 > foo

COUNT=0
while read VAR1; do
    cat foo | while read VAR2; do
        let COUNT++
        echo $COUNT
    done
done < foo

输出:123123123

4 个答案:

答案 0 :(得分:3)

不同之处在于管道在子shell中运行。因此,在第二种情况下,在内循环结束后,对COUNT变量的更改不会保留。

答案 1 :(得分:3)

使用|调用子shell,因此你的变量中没有值。

快速查看调试日志将解释该方案。将这两个脚本作为bash -x scriptname运行,您应该自己回答。

答案 2 :(得分:2)

在第二个示例中,内部循环位于管道中。因此,它在子shell中执行,因此对变量COUNT的更改是内部循环的本地。

答案 3 :(得分:0)

您的cat foo | ...看起来很可疑。基本上,我认为您在不进入foo VAR2循环的情况下一次又一次地捕获文件while