The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"доступ к внешним переменным"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Shell скрипты)
Изначальное сообщение [ Отслеживать ]

"доступ к внешним переменным"  +/
Сообщение от Андрей (??) on 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

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "доступ к внешним переменным"  +/
Сообщение от Andrey Mitrofanov on 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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "доступ к внешним переменным"  +/
Сообщение от Андрей (??) on 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

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


Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "доступ к внешним переменным"  +/
Сообщение от Wulf (??) on 14-Апр-11, 22:02 
иногда прокатывает такое:
data=`cat file`
for word in $data
do
  ...
done

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

5. "доступ к внешним переменным"  +/
Сообщение от Andrey Mitrofanov on 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)
$ _

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

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

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

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



  
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

6. "доступ к внешним переменным"  +/
Сообщение от LSTemp (ok) on 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]#  

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру