![Shell 变量不会因 pipe-while-read 组合而改变](https://linux22.com/image/986062/Shell%20%E5%8F%98%E9%87%8F%E4%B8%8D%E4%BC%9A%E5%9B%A0%20pipe-while-read%20%E7%BB%84%E5%90%88%E8%80%8C%E6%94%B9%E5%8F%98.png)
考虑情况 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 循环内发生变化,但在循环外不会发生变化。
我在这里到底缺少什么?
答案1
在第一种情况下,所有命令都在同一个 shell 中执行。的内容COUNT
已更改。
在第二种情况下,子shell 是用管道启动的|
,子shell 中的更改对当前shell 没有影响。但是子shell 知道变量COUNT
,并且第一个输出是2
。