URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 1212
[ Назад ]

Исходное сообщение
"Цикл WHILE в SHELL"

Отправлено Yurijs , 23-Дек-02 19:35 
Вопрос по работе цикла.
Этот скрипт считает количество строк в файле,
имя которого получает как парамет.

#!/bin/sh
COUNTER=0
while read TEXTLINE
do
COUNTER=`expr $COUNTER + 1`
echo $COUNTER
done < $1
echo "TOTAL: $COUNTER"

Ниже результат работы.
Почему обнулилась переменная при выходе из цикла ?
И как это предотвратить ?

1
2
3
TOTAL: 0


Содержание

Сообщения в этом обсуждении
"RE: Цикл WHILE в SHELL"
Отправлено Vladislav , 24-Дек-02 09:21 
>Вопрос по работе цикла.
>Этот скрипт считает количество строк в файле,
>имя которого получает как парамет.
>
>#!/bin/sh
>COUNTER=0
>while read TEXTLINE
>do
>COUNTER=`expr $COUNTER + 1`
>echo $COUNTER
>done < $1
>echo "TOTAL: $COUNTER"
>
>Ниже результат работы.
>Почему обнулилась переменная при выходе из цикла ?
>И как это предотвратить ?
>
>1
>2
>3
>TOTAL: 0

странный скрипт .. у меня вообще такой не работает :)


"RE: Цикл WHILE в SHELL"
Отправлено LS , 29-Дек-02 12:38 
>Вопрос по работе цикла.
>Этот скрипт считает количество строк в файле,
>имя которого получает как парамет.
>
>#!/bin/sh
>COUNTER=0
>while read TEXTLINE
>do
>COUNTER=`expr $COUNTER + 1`
>echo $COUNTER
>done < $1
>echo "TOTAL: $COUNTER"
>
>Ниже результат работы.
>Почему обнулилась переменная при выходе из цикла ?
>И как это предотвратить ?
>
>1
>2
>3
>TOTAL: 0


утверждать не берусь, так как в основном с bash работаю, но есть подозрение, что при перенапралении ввода обработка цикла происходит в сабшелле. и изменяешь ты внутри цикла переменную этого сабшелла, которая при выходе из него просто перестает существовать. попробуй так:

#!/bin/sh
COUNTER=0

function fff()
{
while read TEXTLINE | return $COUNTER
do
COUNTER=`expr $COUNTER + 1`
echo $COUNTER
done < $1
}

fff
echo "TOTAL: $?"


PS в bash'е твой скрипт нормально отрабатывает. там похожая ситуация возникает только если пайпы использовать (cat $1 | while ...), а при
"< $1" - все хорошо


"RE: Цикл WHILE в SHELL"
Отправлено LS , 29-Дек-02 12:42 
>#!/bin/sh
>COUNTER=0
>
>function fff()
>{
>while read TEXTLINE | return $COUNTER
>do
>COUNTER=`expr $COUNTER + 1`
>echo $COUNTER
>done < $1
>}
>
>fff

тут должно быть fff $1

>echo "TOTAL: $?"


"RE: Цикл WHILE в SHELL"
Отправлено joker , 29-Дек-02 14:07 
а юзать wc уже не модно ?

"RE: Цикл WHILE в SHELL"
Отправлено LS , 29-Дек-02 14:14 
>а юзать wc уже не модно ?

а это смотря, что сделать надо. если просто количество строк посчитать, то несомненно через wc легче, а если паралельно с подсчетом еще и их обработку производить - тут wc не помошник. спрашивали же почему скрипт не работает, а не как количество строк в файле подсчитать :)