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

Исходное сообщение
"доступ к внешним переменным"

Отправлено Андрей , 14-Апр-11 18:30 
День добрый, коллеги!
Желаемый результат сценария ниже - это получить значение R из внутреннего (вложенного) цикла while, и на его основании принять решение о завершении внешнего цикла.
На самом деле получается бесконечный цикл, т.к. за пределами внутреннего while всегда остается R=0.
Т.е. получается, нужно что-то по смыслу как указатели с разименованием, но в шеле я не знаю ничего подобного.
Пожалуйста, подскажите как быть?

R=0
while [ $R -eq 0 ]
do
  cat file|while read data
  do
    R=1
    ....<do stuff>....
    [ $data = "blah" ] || R=0
  done
done


Содержание

Сообщения в этом обсуждении
"доступ к внешним переменным"
Отправлено Andrey Mitrofanov , 14-Апр-11 18:39 
Да скока ж можно... http://lmgtfy.com/?q=%D1%81%D1%83%D...

> while [ $R -eq 0 ]
> do
>   cat file|while read data

while read data

>   do
>     R=1
>     ....<do stuff>....
>     [ $data = "blah" ] || R=0
>   done

done <file

> done


"доступ к внешним переменным"
Отправлено Андрей , 14-Апр-11 19:03 
>[оверквотинг удален]
>> do
>>   cat file|while read data
> while read data
>>   do
>>     R=1
>>     ....<do stuff>....
>>     [ $data = "blah" ] || R=0
>>   done
> done <file
>> done

эм... ОК, спасибо.
Ни то что бы я совсем до этого не додумался, но посчитал такое решение слишком корявым, потому и не стал про него даже упоминать.
Хотел узнать существует ли более м.. "правильный" способ, без временных файлов и дисковых операций.
Выходит что нет.
Но в любом случае спасибо! )



"доступ к внешним переменным"
Отправлено Wulf , 14-Апр-11 22:02 
иногда прокатывает такое:
data=`cat file`
for word in $data
do
  ...
done


"доступ к внешним переменным"
Отправлено Andrey Mitrofanov , 15-Апр-11 09:25 
> Хотел узнать существует ли более м.. "правильный" способ, без временных файлов и
> дисковых операций.

А где в примере, кот. ты показал именно _временый файл?...
В первом посте были какие-то невнятные проблемы с цЫклами, сейчас с "временными" файлами.

> Выходит что нет.

#!/bin/bash

X=
while read file; do
  [ -e "$file" ] && X="${X:+$X }$file"
done < <( ls | grep '^a.*bb.*ccc$' )    #и да, это bash-изм

[ "$X" ] && echo "o.m.f.g., files: ($X)" || echo "Okie, no files."

$ ./the-script
Okie, no files.
$ touch a111bb222ccc
$ ./the-script
o.m.f.g., file(s): (a111bb222ccc)
$ touch a111bb223ccc
$ ./the-script
o.m.f.g., file(s): (a111bb222ccc a111bb223ccc)
$ _


"доступ к внешним переменным"
Отправлено pavlinux , 15-Апр-11 04:03 
>  получить значение R из внутреннего (вложенного)  цикла while,
> и на его основании принять решение о завершении внешнего цикла.

Дык, break поставь

     [ $data  = "blah" ] && break || R=0 ;
# или
     [ $data != "blah" ] && R=0   || break;



  

"доступ к внешним переменным"
Отправлено LSTemp , 20-Апр-11 19:58 
> День добрый, коллеги!
> Желаемый результат сценария ниже - это получить значение R из внутреннего (вложенного)
> цикла while, и на его основании принять решение о завершении внешнего
> цикла.
> На самом деле получается бесконечный цикл, т.к. за пределами внутреннего while всегда
> остается R=0.
> Т.е. получается, нужно что-то по смыслу как указатели с разименованием, но в
> шеле я не знаю ничего подобного.

[root@local bind]# a='aaa'; b='a'; echo "${a} ${b} ${!b}"
aaa a aaa

надо учиться...

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

> Пожалуйста, подскажите как быть?

мб так для самого простого варианта?:

cat file|\
grep 'blah'|\
awk '{ <script_do_staf> }'

> R=0
> while [ $R -eq 0 ]
> do
>   cat file|while read data
>   do
>     R=1
>     ....<do stuff>....
>     [ $data = "blah" ] || R=0

для bash правильно:
[ $data == "blah" ]
если уж строки сравниваются

еще правильней:
[ "$data" == 'blah' ]
ибо в значении data пробелы могут быть, которые без кавычек интерпритируются как отдельная команда шела

>   done
> done

доступ к внешним переменным так например можно сделать:

all=`cat file|\
while read line
do
  echo "$line"
done`

echo "$all"

---  

[root@local temp]# cat txt.txt
111
222
333

[root@local temp]# cat ttttttt
#!/bin/bash

all=`cat txt.txt|\
while read line
do
  echo "do_stuff $line"
done`
  
echo "$all"

[root@local temp]# ./ttttttt
do_stuff 111
do_stuff 222
do_stuff 333

[root@local temp]#