Переменная Shell не изменяется с pipe-while-read комбинацией

Рассмотрите случай 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

Как Вы видите в этом случае, КОЛИЧЕСТВО осталось тем же. Почему? Таким образом это изменяется в цикле с условием продолжения, но не, после того как это не в курсе.

Что точно я пропускаю здесь?

5
задан 30 November 2015 в 02:05

1 ответ

В Вашем первом случае, все команды, выполняемые в той же оболочке. Содержание COUNT изменяется.

В Вашем втором случае подоболочка запускается с передачи по каналу | и изменяется в подоболочке, не имеют никакого эффекта в текущей оболочке. Но он подокружает, знает переменную COUNT, и первый вывод 2.

6
ответ дан 23 November 2019 в 09:13

Другие вопросы по тегам:

Похожие вопросы: