День добрый, коллеги!
Желаемый результат сценария ниже - это получить значение 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
Да скока ж можно... http://lmgtfy.com/?q=%D1%81%D1%83%D...> while [ $R -eq 0 ]
> do
> cat file|while read datawhile read data
> do
> R=1
> ....<do stuff>....
> [ $data = "blah" ] || R=0
> donedone <file
> done
>[оверквотинг удален]
>> do
>> cat file|while read data
> while read data
>> do
>> R=1
>> ....<do stuff>....
>> [ $data = "blah" ] || R=0
>> done
> done <file
>> doneэм... ОК, спасибо.
Ни то что бы я совсем до этого не додумался, но посчитал такое решение слишком корявым, потому и не стал про него даже упоминать.
Хотел узнать существует ли более м.. "правильный" способ, без временных файлов и дисковых операций.
Выходит что нет.
Но в любом случае спасибо! )
иногда прокатывает такое:
data=`cat file`
for word in $data
do
...
done
> Хотел узнать существует ли более м.. "правильный" способ, без временных файлов и
> дисковых операций.А где в примере, кот. ты показал именно _временый файл?...
В первом посте были какие-то невнятные проблемы с цЫклами, сейчас с "временными" файлами.> Выходит что нет.
#!/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)
$ _
> получить значение R из внутреннего (вложенного) цикла while,
> и на его основании принять решение о завершении внешнего цикла.Дык, break поставь
[ $data = "blah" ] && break || R=0 ;
# или
[ $data != "blah" ] && R=0 || break;
> День добрый, коллеги!
> Желаемый результат сценария ниже - это получить значение 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/bashall=`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]#