4

我想知道为什么这个 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

4 回答 4

4

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

于 2013-05-28T21:59:44.227 回答
3

使用|调用子shell,因此您的变量在其中没有任何价值。

快速查看调试日志将解释该场景。运行这两个脚本bash -x scriptname,你应该自己回答。

于 2013-05-28T22:01:25.067 回答
2

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

于 2013-05-28T22:02:28.277 回答
0

cat foo | ...看起来对我很可疑。基本上,我认为你会foo一次又一次地得到文件而不进入VAR2 while循环。

于 2013-05-28T21:57:19.693 回答