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

Ser*_*nyy 5 command-line bash

考虑案例 1:

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

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
Run Code Online (Sandbox Code Playgroud)

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

我到底错过了什么?

A.B*_*.B. 6

在您的第一种情况下,所有命令都在同一个 shell 中执行。的内容COUNT发生了变化。

在您的第二种情况下,子外壳以 pipe 开头,|子外壳中的更改对当前外壳没有影响。但是他的子shell知道变量COUNT并且第一个输出是2.

  • @Serg 那行不通,因为 `while` 循环仍然在分叉的 shell 中运行;在这种情况下,您可以使用进程替换来反转命令,以便`find` 在分叉的shell 中运行,而`while` 循环在当前shell 中运行:`COUNT=0; 而 IFS= read -r -d '' FILE; 做 echo "$FILE"; COUNT=$((COUNT+1));done <<(fi​​nd .-print0); 回声 $COUNT` (3认同)