Куда девались значения переменных, которые я присваивал? Думаю не я один попадался в эту ловушку, поэтому рассказываю.

Предположим, у вас есть например файл с какими-то числами в столбик, назовём его условно 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

Удачи!