我想知道为什么这个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
答案 0 :(得分:3)
不同之处在于管道在子shell中运行。因此,在第二种情况下,在内循环结束后,对COUNT变量的更改不会保留。
答案 1 :(得分:3)
使用|
调用子shell,因此你的变量中没有值。
快速查看调试日志将解释该方案。将这两个脚本作为bash -x scriptname
运行,您应该自己回答。
答案 2 :(得分:2)
在第二个示例中,内部循环位于管道中。因此,它在子shell中执行,因此对变量COUNT的更改是内部循环的本地。
答案 3 :(得分:0)
您的cat foo | ...
看起来很可疑。基本上,我认为您在不进入foo
VAR2
循环的情况下一次又一次地捕获文件while
。