Здравствуйте,заполняю массив целыми числами в следующем цикле. Работает как ожидается.
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
>[оверквотинг удален]
> Если меняю строчку 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
> Вы наступили на старые проверенные грабли. :-)
> Дело в том, что пользуясь конвейером, вы запускаете цикл в отдельном
> экземпляре bash и когда цикл отрабатывает, то этот самый отдельный экземпляр
> закрывается, унося в небытие все наработанные в нем данные. Попробуйте вместо
> конвейера cat | while использовать перенаправление:
>
> while read line; do
> . . .
> done < $file
>Да, действительно, с перенаправлением работает.
Было у меня подозрение об отдельном экземпляре, но не смог этого проверить.
$$ и в цикле и вне его возвращало тот же id. Ничего другого не придумал :)Спасибо.