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

Исходное сообщение
"вернуть переменную из цикла while"

Отправлено evi9 , 18-Фев-09 12:21 
Есть цикл:

ls -l ( while read FILE ;

do

test BLA-BLA-BLA {
result="error"
continue
                  }
result="ok"
exit

done)

echo $result

Так вот, переменная result принимает значения "error" или "ok",
но по завершению цикла она стирается... echo в конце скрипта не выводит ничего. Как из цикла передать переменную?



Содержание

Сообщения в этом обсуждении
"вернуть переменную из цикла while"
Отправлено vic , 18-Фев-09 12:41 
а вы уверены что из цикла? ваш пример не запускается, не читабелен и не понятен. И судя по всему вы хотите получить переменную не из цикла, а из вложенного неявного subsh. А это решается иначе.

Для цикла же переменная нормально возвращается:


#!/bin/bash
for i in 1 2
do
    for j in 4 5
    do
        k=$((k+i+j))
        echo "iteration ($i $j) = $k"
    done
done
echo "result: $k"


"вернуть переменную из цикла while"
Отправлено gaa , 18-Фев-09 12:48 
> Как из цикла передать переменную?

Цикл, возможно, запускается в отдельном интерпретаторе, переменные из которого в родительском не видны. Так что способ один: сохранить значение переменной в файл, а потом его оттуда прочесть.


"вернуть переменную из цикла while"
Отправлено phpcoder , 18-Фев-09 13:06 
>> Как из цикла передать переменную?
>
>Цикл, возможно, запускается в отдельном интерпретаторе

Не "возможно", а точно, т.к. while заключен в круглые скобки, которые порождают отдельный интепретатор.


"вернуть переменную из цикла while"
Отправлено vic , 18-Фев-09 13:21 
>> Как из цикла передать переменную?
>
>Цикл, возможно, запускается в отдельном интерпретаторе, переменные из которого в родительском не
>видны. Так что способ один: сохранить значение переменной в файл, а
>потом его оттуда прочесть.

ну прямо один :)
- вернуть через код возврата если это нечто типа 0/1
- вернуть через stdout: kkk=`date`
- через файл и т.д.
а вообще осознать разницу между () и {} - subshell vs sameshell


"+5 копеек"
Отправлено Andrey Mitrofanov , 18-Фев-09 14:01 
>Есть цикл:
>
>ls -l ( while read FILE ;

<ls -l | (....
, видимо.
>done)
>echo $result

google.ru + переменная цикл bash opennet.ru/openforum/
http:/openforum/vsluhforumID9/7255.html#1
http:/openforum/vsluhforumID9/7536.html#3

Продолжение осмотра:
http:/docs/RUS/bash_scripting_guide/

---Про не-bash - не интересно. Гугль работает - обращайтесь.


"+5 копеек"
Отправлено LS , 28-Фев-09 05:33 
>>Есть цикл:
>>
>>ls -l ( while read FILE ;
>
><ls -l | (....

конвейер тоже в отдельном шеле пойдет

>[оверквотинг удален]
>>echo $result
>
>google.ru + переменная цикл bash opennet.ru/openforum/
>http:/openforum/vsluhforumID9/7255.html#1
>http:/openforum/vsluhforumID9/7536.html#3
>
>Продолжение осмотра:
>http:/docs/RUS/bash_scripting_guide/
>
>---Про не-bash - не интересно. Гугль работает - обращайтесь.


"вернуть переменную из цикла while"
Отправлено LS , 28-Фев-09 05:18 
>[оверквотинг удален]
>result="ok"
>exit
>
>done)
>
>echo $result
>
>Так вот, переменная result принимает значения "error" или "ok",
>но по завершению цикла она стирается... echo в конце скрипта не выводит
>ничего. Как из цикла передать переменную?

нукак . все что внутри ()  - выполняется в отдельно запущенной оболочке. есть обходные маневры но на BLA-BLA примере непонятно , что Вы хотите сделать



"вернуть переменную из цикла while"
Отправлено LS , 28-Фев-09 06:12 
[root@local 111]# ls
ttt.bsh  txt.txt
[root@local 111]# cat ttt.bsh
#!/bin/bash

function fff()
{
ls
}

function rrr()
{
echo $0
# cat $!
}

fff|while read nnn
do
cat $nnn|while read lll
do
   echo $lll
done
done


[root@local 111]#

---------------

[root@local 111]# ./ttt.bsh
#!/bin/bash

function fff()
{
ls
}

function rrr()
{
echo $0
}

fff|while read nnn
do
cat $nnn|while read lll
do
echo $lll
done
done


111
222
333
[root@local 111]#

пс. ну не сделал кат тхт.тхт - прошу на слово повери что там было 111 222 333 :)
пспс это один из вариантов "обхода" про которые я говорил и которые совершенно конкретно обозначил Andrey Mitrofanov