Shell变量不会随着管道读取组合而改变

考虑案例1:

$ COUNT=0 ; while [ $COUNT -ne 3 ]; do echo $COUNT; COUNT=$(expr $COUNT + 1 );done 0 1 2 $ echo $COUNT 3 

如预期的那样,在循环结束时COUNT变量为3

考虑案例2:

 $ COUNT=1; find . -print0 | while IFS= read -r -d '' FILE; do echo "$FILE"; expr $COUNT + 1; COUNT=$(expr $COUNT + 1 ) ;done . 2 ./file name 3 ./file 4 ./a b 5 $ echo $COUNT 1 

如您所见,在这种情况下,COUNT保持不变。 为什么? 可以看出它在while循环内部发生了变化,但是一旦它不在循环中就会发生变化。

我到底错过了什么?

在第一种情况下,所有命令都在同一个shell中执行。 COUNT的内容已更改。

在第二种情况下,子管道以管道|开始 ,子shell中的更改对当前shell没有影响。 但是他的子shell知道变量COUNT ,第一个输出是2