Куда девались значения переменных, которые я присваивал? Думаю не я один попадался в эту ловушку, поэтому рассказываю.
Предположим, у вас есть например файл с какими-то числами в столбик, назовём его условно data
,
и вы хотите при помощи shell-скрипта все эти числа сложить. И пишете такой кусок:
SUM=0 cat data | while read NUM do SUM=$((SUM+NUM)) done echo $SUM
Удивительным образом, программа выводит 0. Что ж такое, думаете вы! Куда деваются значения, я же их присваивал!
Разгадка конечно проста (хотя лично я то и дело об этом забываю):
ведь команды, которые входят в pipeline (в данном случае, нам важен цикл while
), выполняются как отдельные процессы.
Так что переменные хоть и присваиваются, это никоим образом не может повлиять на их значения в основном скрипте — это же другой (родительский) процесс!
Заставить всё это работать как надо можно двумя способами.
Первый — загнать echo
в тот же процесс что и while
, при помощи скобочек, вот так:
SUM=0 cat data | { while read NUM do SUM=$((SUM+NUM)) done echo $SUM }
Второй — избавиться от лишнего процесса вовсе (а заодно и от cat
):
SUM=0 while read NUM do SUM=$((SUM+NUM)) done < data echo $SUM
Удачи!