Вывод переменной из цикла while

Модератор: Модераторы разделов

CoffiN
Сообщения: 11

Вывод переменной из цикла while

Сообщение CoffiN »

Возник трабл...

При выводе переменной, которую вычисляю в цикле, пусто. Кажется что она имеет некое значение только в гранях do.....done, т. к. вывод там работает.

Ничего умного в голову не приходит....(( Кто-нибудь может стыкался с таким траблом....
Спасибо сказали:
Аватара пользователя
broom
Бывший модератор
Сообщения: 1629
Статус: мизантроп.ка
ОС: Gentoo

Re: Вывод переменной из цикла while

Сообщение broom »

Встречалось такое, да. Но я не разобралась, баг это или фича.
Покажите ваш скрипт, мне удалось решить проблему составлением немного другой конструкции.
but in the darkness, behind your smile, you scream... © Dio
Спасибо сказали:
Аватара пользователя
Voice
Сообщения: 1073
Статус: столлманист
ОС: Debian GNU/Linux

Re: Вывод переменной из цикла while

Сообщение Voice »

Да вроде как работает...

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

[user@foo tmp] $ cat foo.sh
#!/bin/bash

i=0

while [ $i -lt 10 ]
do
    i=$(($i + 1))
done

echo $i
[user@foo tmp] $ bash foo.sh
10
[user@foo tmp] $
"И может собственных Платонов и быстрых разумом Невтонов российская земля рождать."
М. В. Ломоносов
Спасибо сказали:
CoffiN
Сообщения: 11

Re: Вывод переменной из цикла while

Сообщение CoffiN »

Voice писал(а):
09.12.2008 17:47
Да вроде как работает...

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

[user@foo tmp] $ cat foo.sh
#!/bin/bash

i=0

while [ $i -lt 10 ]
do
    i=$(($i + 1))
done

echo $i
[user@foo tmp] $ bash foo.sh
10
[user@foo tmp] $


Завидую....))

Встречалось такое, да. Но я не разобралась, баг это или фича.
Покажите ваш скрипт, мне удалось решить проблему составлением немного другой конструкции.


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

echo "select lost from $TABLE where login = '$LOGIN';" |  mysql -h $IP_ADDR -u $USER_NAME -p$PASSWORD $BASE_NAME | while read l
do
        if echo $l | grep -q "lost"

                then    kilkist=0
                        summ=0

                        else    kilkist=`expr $kilkist + 1`
                                summ=`expr $summ + $l`
        fi
#ser=`expr $summ / $kilkist`
#echo "$ser"
done

if echo $n | grep -q PPPoE

        then    ser=`expr $summ / $kilkist`
                       echo    "insert into top20
                       values('$DT','$LOGIN','$IP',NULL,'$summ',NULL);" | mysql -h $IP_ADDR -u $USER_NAME -p$PASSWORD $BASE_NAME
fi


Пример НЕ рабочего кода..... $summ и $kilkist во время расчета пустые.....(( Закоментырованые "#ser=`expr $summ / $kilkist`" и "#echo "$ser"" - работают.
Спасибо сказали:
Аватара пользователя
broom
Бывший модератор
Сообщения: 1629
Статус: мизантроп.ка
ОС: Gentoo

Re: Вывод переменной из цикла while

Сообщение broom »

Нашла, что у меня не работало.
Вот так переменные оставались только внутри цикла:
cat settings.txt | while read -r line; do export "$line"; done

А так нормально:
while read -r line; do export "$line"; done < settings.txt


Видимо, фигня возникает, когда направляешь что-то в while через конвейер...
but in the darkness, behind your smile, you scream... © Dio
Спасибо сказали:
CoffiN
Сообщения: 11

Re: Вывод переменной из цикла while

Сообщение CoffiN »

broom писал(а):
09.12.2008 18:16
Нашла, что у меня не работало.
Вот так переменные оставались только внутри цикла:
cat settings.txt | while read -r line; do export "$line"; done

А так нормально:
while read -r line; do export "$line"; done < settings.txt


Видимо, фигня возникает, когда направляешь что-то в while через конвейер...


Редирект не работает, инфу беру из БД..... Неужели придется шаманить что-то, чобы выбросить этот цикл...((
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Вывод переменной из цикла while

Сообщение diesel »

CoffiN писал(а):
09.12.2008 18:10
Пример НЕ рабочего кода..... $summ и $kilkist во время расчета пустые.....(( Закоментырованые "#ser=`expr $summ / $kilkist`" и "#echo "$ser"" - работают.

во-первых, попробуйте инициализировать переменные до цикла.
во-вторых, вы точно уверенны что эти переменные в обязательном порядке надо обнулять ежели lost в текущей строке выборки не найдено(правда тогда это все заменяется простым sql-запросом).

в текущем виде можно перерисовать в что-то типа:

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

echo "select lost from $TABLE where login = '$LOGIN';" |  mysql -h $IP_ADDR -u $USER_NAME -p$PASSWORD $BASE_NAME | awk 'BEGIN{summ=0} $1~/lost/{summ += 1} $1 !~ /lost/ {summ = 0}; END{print summ}'


or smth like, и получить вывод в переменную:

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

var = $(echo "select lost from $TABLE where login = '$LOGIN';" |  mysql -h $IP_ADDR -u $USER_NAME -p$PASSWORD $BASE_NAME | awk 'BEGIN{summ=0} $1~/lost/{summ += 1} $1 !~ /lost/ {summ = 0}; END{print summ}');


не тестил...

ser=`expr $summ / $kilkist` если переменная таки 0, кстати, будет весьма колоритно смотреться :)
Спасибо сказали: