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

Исходное сообщение
"Массивы в shell. Непонятный момент."

Отправлено shadowmaan , 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


Содержание

Сообщения в этом обсуждении
"Массивы в shell. Непонятный момент."
Отправлено allez , 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


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

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

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

Спасибо.