The OpenNET Project / Index page

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

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

"Массивы в shell. Непонятный момент."  +/
Сообщение от shadowmaan (ok) on 13-Ноя-11, 01:06 
Здравствуйте,

заполняю массив целыми числами в следующем цикле. Работает как ожидается.

n=0
for line in 3 5 8; do
    nums[$n]=$line
    ((n=$n+1))
done
printf "length: %s\n" ${#nums[@]}  ## печатает 3

Если меняю строчку for на следующие

cat $file |
while read line; do

где $file - имя файла со значениями в виде
3
5
8

то в результате массив nums по выходу из цикла остается нулевым.

Не могу понять в чем различие. Внутри цикла массив изменяется как положено.

$BASH_VERSION: 3.2.48(1)-release

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

Оглавление

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


1. "Массивы в shell. Непонятный момент."  +/
Сообщение от allez (ok) on 13-Ноя-11, 05:42 
>[оверквотинг удален]
> Если меняю строчку for на следующие
> cat $file |
> while read line; do
> где $file - имя файла со значениями в виде
> 3
> 5
> 8
> то в результате массив nums по выходу из цикла остается нулевым.
> Не могу понять в чем различие. Внутри цикла массив изменяется как положено.
> $BASH_VERSION: 3.2.48(1)-release

Вы наступили на старые проверенные грабли. :-)
Дело в том, что пользуясь конвейером, вы запускаете цикл в отдельном
экземпляре bash и когда цикл отрабатывает, то этот самый отдельный экземпляр
закрывается, унося в небытие все наработанные в нем данные. Попробуйте вместо
конвейера cat | while использовать перенаправление:


while read line; do
. . .
done < $file

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

2. "Массивы в shell. Непонятный момент."  +/
Сообщение от shadowmaan (ok) on 13-Ноя-11, 12:12 
> Вы наступили на старые проверенные грабли. :-)
> Дело в том, что пользуясь конвейером, вы запускаете цикл в отдельном
> экземпляре bash и когда цикл отрабатывает, то этот самый отдельный экземпляр
> закрывается, унося в небытие все наработанные в нем данные. Попробуйте вместо
> конвейера cat | while использовать перенаправление:
>
 
> while read line; do
> . . .
> done < $file
>

Да, действительно, с перенаправлением работает.

Было у меня подозрение об отдельном экземпляре, но не смог этого проверить.
$$ и в цикле и вне его возвращало тот же id. Ничего другого не придумал :)

Спасибо.

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

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

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




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

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