The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Массивы в 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, 05:42 , 13-Ноя-11 (1)
    >[оверквотинг удален]
    > Если меняю строчку 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, 12:12 , 13-Ноя-11 (2)
      > Вы наступили на старые проверенные грабли. :-)
      > Дело в том, что пользуясь конвейером, вы запускаете цикл в отдельном
      > экземпляре bash и когда цикл отрабатывает, то этот самый отдельный экземпляр
      > закрывается, унося в небытие все наработанные в нем данные. Попробуйте вместо
      > конвейера cat | while использовать перенаправление:
      >
       
      > while read line; do
      > . . .
      > done < $file
      >

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

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

      Спасибо.




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

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