Есть цикл:ls -l ( while read FILE ;
do
test BLA-BLA-BLA {
result="error"
continue
}
result="ok"
exitdone)
echo $result
Так вот, переменная result принимает значения "error" или "ok",
но по завершению цикла она стирается... echo в конце скрипта не выводит ничего. Как из цикла передать переменную?
а вы уверены что из цикла? ваш пример не запускается, не читабелен и не понятен. И судя по всему вы хотите получить переменную не из цикла, а из вложенного неявного 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 заключен в круглые скобки, которые порождают отдельный интепретатор.
>> Как из цикла передать переменную?
>
>Цикл, возможно, запускается в отдельном интерпретаторе, переменные из которого в родительском не
>видны. Так что способ один: сохранить значение переменной в файл, а
>потом его оттуда прочесть.ну прямо один :)
- вернуть через код возврата если это нечто типа 0/1
- вернуть через stdout: kkk=`date`
- через файл и т.д.
а вообще осознать разницу между () и {} - subshell vs sameshell
>Есть цикл:
>
>ls -l ( while read FILE ;<ls -l | (....
, видимо.
>done)
>echo $resultgoogle.ru + переменная цикл bash opennet.ru/openforum/
http:/openforum/vsluhforumID9/7255.html#1
http:/openforum/vsluhforumID9/7536.html#3Продолжение осмотра:
http:/docs/RUS/bash_scripting_guide/---Про не-bash - не интересно. Гугль работает - обращайтесь.
>>Есть цикл:
>>
>>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 - не интересно. Гугль работает - обращайтесь.
>[оверквотинг удален]
>result="ok"
>exit
>
>done)
>
>echo $result
>
>Так вот, переменная result принимает значения "error" или "ok",
>но по завершению цикла она стирается... echo в конце скрипта не выводит
>ничего. Как из цикла передать переменную?нукак . все что внутри () - выполняется в отдельно запущенной оболочке. есть обходные маневры но на BLA-BLA примере непонятно , что Вы хотите сделать
[root@local 111]# ls
ttt.bsh txt.txt
[root@local 111]# cat ttt.bsh
#!/bin/bashfunction 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/bashfunction 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