The OpenNET Project / Index page

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

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

"Видимость и время жизни переменных в sh/bash"  +/
Сообщение от anonymous (??) on 27-Июл-11, 21:41 
Есть код такого плана: команда формирует список, далее этот список передается по пайпу циклу while и инструкции read; к сожалению, после завершения цикла переменные перестают существовать. export var тоже не помогает. Пример кода:
ls / | while read dir1 dir2
do
...some commands...
export dir3=$dir1
done
echo $dir1
echo $dir3
Так вот, echo $dir1, $dir3 дает пустой результат.
Если сделать echo $dir1 в цикле - нормально, возвращает значение переменной. Как сохранить значение переменной после выхода из цикла?
Ответить | Правка | Cообщить модератору

Оглавление

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


1. "Видимость и время жизни переменных в sh/bash"  +/
Сообщение от allez (ok) on 28-Июл-11, 05:32 
> Так вот, echo $dir1, $dir3 дает пустой результат.
> Если сделать echo $dir1 в цикле - нормально, возвращает значение переменной. Как
> сохранить значение переменной после выхода из цикла?

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

Попробуйте использовать, например, промежуточный файл и перенаправление:


ls / > file.lst
while read dir1 dir2
do
  ...some commands...
done < file.lst

P. S. Кстати, не вижу особого смысла считывать из потока ввода две переменных подряд.
Ведь ls будет выдавать по одному имени файла в строке и тогда переменная dir2 всегда будет
пустой. Это если в именах не будет пробелов. Если же пробелы будут, то в dir1 уйдет первое
слово имени, а в dir2 - все остальные. Есть риск получить кашу с винегретом. :-)

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

2. "Видимость и время жизни переменных в sh/bash"  +/
Сообщение от Аноним (??) on 28-Июл-11, 07:17 
>[оверквотинг удален]
> ls / | while read dir1 dir2
> do
> ...some commands...
> export dir3=$dir1
> done
> echo $dir1
> echo $dir3
> Так вот, echo $dir1, $dir3 дает пустой результат.
> Если сделать echo $dir1 в цикле - нормально, возвращает значение переменной. Как
> сохранить значение переменной после выхода из цикла?

dir3=`ls / | { while read dir1 dir2; do ...some commands...; done; echo $dir1; }`

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

3. "Видимость и время жизни переменных в sh/bash"  +/
Сообщение от allez (ok) on 28-Июл-11, 10:25 
> dir3=`ls / | { while read dir1 dir2; do ...some commands...; done;
> echo $dir1; }`

Однако, индейская национальная народная изба получается. :-)


$ ls / | { while read dir1 dir2; do echo "'$dir1', '$dir2'"; done; echo "======"; echo "dir1 = '$dir1'"; }
'bin', ''
'boot', ''
'dev', ''
'etc', ''
'home', ''
'lib', ''
'lib64', ''
'lost+found', ''
'media', ''
'mnt', ''
'opt', ''
'proc', ''
'root', ''
'sbin', ''
'selinux', ''
'srv', ''
'sys', ''
'tmp', ''
'usr', ''
'var', ''
======
dir1 = ''

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

4. "Видимость и время жизни переменных в sh/bash"  +/
Сообщение от Аноним (??) on 28-Июл-11, 13:08 
>[оверквотинг удален]
> 'sbin', ''
> 'selinux', ''
> 'srv', ''
> 'sys', ''
> 'tmp', ''
> 'usr', ''
> 'var', ''
> ======
> dir1 = ''
>

:)
dir3=`ls / | { while read dir1 dir2; do echo $dir1 > /dev/null; dir=$dir1; done; echo $dir; }`
P.s. to subject sed, awk, http://ru.wikipedia.org/wiki/Программы_UNIX-подобных_операционных_систем

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

5. "Видимость и время жизни переменных в sh/bash"  +/
Сообщение от Аноним (??) on 28-Июл-11, 13:37 
#!/bin/bash
while read -r dir1; do  dir3=${dir3}\ ${dir1}; done < <(ls /); echo "$dir3";
Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

6. "Видимость и время жизни переменных в sh/bash"  +/
Сообщение от Аноним (??) on 28-Июл-11, 14:06 
>[оверквотинг удален]
>> 'tmp', ''
>> 'usr', ''
>> 'var', ''
>> ======
>> dir1 = ''
>>
> :)
> dir3=`ls / | { while read dir1 dir2; do echo $dir1 >
> /dev/null; dir=$dir1; done; echo $dir; }`
> P.s. to subject sed, awk, http://ru.wikipedia.org/wiki/Программы_UNIX-подобных_операционных_систем

dir=`ls / | { while read dir1; do echo a > /dev/null; dir="${dir} ${dir1}"; done; echo $dir; }`;
read -r a b c << EOF
$dir
EOF
echo $a
bin
echo $b
boot
echo $c
dev ...

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

7. "Видимость и время жизни переменных в sh/bash"  +/
Сообщение от anonymous (??) on 28-Июл-11, 20:27 
>[оверквотинг удален]
> dir="${dir} ${dir1}"; done; echo $dir; }`;
> read -r a b c << EOF
> $dir
> EOF
> echo $a
> bin
> echo $b
> boot
> echo $c
> dev ...

Всем спасибо! Разобрался, как удачнее сделать в моем случае, но все предоставленные варианты были интересны и я их запомнил на будущее.;)

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

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

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




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

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