Обнуление переменной после цикла

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
UxN
рядовой
Сообщения: 49
Зарегистрирован: 2010-02-27 19:06:19
Откуда: Km.Ua
Контактная информация:

Обнуление переменной после цикла

Непрочитанное сообщение UxN » 2012-05-26 17:47:50

Здравствуйте господа. Есть проблема.
к примеру:

Код: Выделить всё

a=0
cat file | while read str
do
a=`let a += 1`
echo ${a}
done
echo ${a}
вывод будет вида:

Код: Выделить всё

1
2
3
4
5
0
Почему так? Что я делаю не так? Почему после выхода из цикла переменная обнуляется. Как можно избежать подобного ?
Ash nazg durbatul?k, ash nazg gimbatul, ash nazg thrakatul?k, agh burzum-ishi krimpatul.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: Обнуление переменной после цикла

Непрочитанное сообщение kpp » 2012-05-26 23:21:49

Конструкция While, вызываемая по конвееру, выполняется в дочернем шелле, а из дочернего шелла, как известно, значения переменных передать в родительский невозможно.
Судя по конструкции

Код: Выделить всё

let a += 1
вы используете Korn Shell.
Я с ним дела не имел, но для нашего эталонного SH избежать подобного можно так:

Код: Выделить всё

a=0
a=$(cat file | ( while read str
do
 a=`expr ${a} + 1`
done
echo $a))
echo $a
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

FiL
ст. лейтенант
Сообщения: 1375
Зарегистрирован: 2010-02-05 0:21:40

Re: Обнуление переменной после цикла

Непрочитанное сообщение FiL » 2012-05-29 18:40:20

ну, или обойтись без конвеера.

Код: Выделить всё

a=0
while read str
do
a=`let a += 1`
echo ${a}
done < file
echo ${a}