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

Исходное сообщение
"Теряется значение переменной при выходе из цикла"

Отправлено Pikador , 17-Авг-06 10:37 
# cat ./tmp.sh
#!/bin/sh

cat ./List | while read SwIP SwPlace; do
   cat ./nettree | while read NetTreeSwPlace NetTreeParent; do
      if [ ${SwPlace} = ${NetTreeSwPlace} ]; then
         Parent=${NetTreeParent}
         echo Этому ${SwPlace} соответствует  ${Parent}
         break
      fi
   done
   echo "----- вне цикла  Этому ${SwPlace} соответствует ${Parent}"
done

Предпоследнее эхо выдает значения обеих переменных, а уже последнее только значение ${SwPlace}. ${Parent} почемуто обнуляется.

Результат работы:
# ./tmp.sh
----- вне цикла  Этому Lnn66-p5 соответствует
Этому Lnn68-p3 соответствует Lnn68-p6
----- вне цикла  Этому Lnn68-p3 соответствует
                                              ^^^^^^^ Отсутствует
----- вне цикла  Этому Unv5-p9 соответствует
----- вне цикла  Этому Lnn64-p9 соответствует
----- вне цикла  Этому Lnn62-p13 соответствует
----- вне цикла  Этому Lnn62-p6 соответствует
----- вне цикла  Этому Lmm18-p6 соответствует
Этому Lmm18-p12 соответствует Lmm18-p9
----- вне цикла  Этому Lmm18-p12 соответствует
                                               ^^^^^^^ Отсутствует
----- вне цикла  Этому Lmm18-p4 соответствует
Этому Lmm18-p9 соответствует Lmm18-p6
----- вне цикла  Этому Lmm18-p9 соответствует
                                              ^^^^^^^ Отсутствует
----- вне цикла  Этому Lmm23-p13 соответствует
----- вне цикла  Этому Lmm23-p9 соответствует

Содержимое файлов:
# cat ./List
192.168.4.3     Lnn66-p5
192.168.4.4     Lnn68-p3
192.168.4.5     Unv5-p9
192.168.4.6     Lnn64-p9
192.168.4.7     Lnn62-p13
192.168.4.9     Lnn62-p6
192.168.4.35    Lmm18-p6
192.168.4.36    Lmm18-p12
192.168.4.39    Lmm18-p4
192.168.4.40    Lmm18-p9
192.168.4.67    Lmm23-p13
192.168.4.69    Lmm23-p9

# cat ./nettree
Lnn66-p6        Lnn66-p7
Lnn66-p7        Lnn66-p5
Lnn66-p8        Lnn66-p7
Lnn66-p9        Lnn66-p10
Lnn66-p10       Lnn66-p7
Lnn66-p11       Lnn66-p10
Lnn66-p12       Lnn66-p10
Lnn62-p14       Lnn62-p13
Lnn62-p15       Lnn62-p13
Lnn62-p16       Lnn62-p13
Lnn62-p17       Lnn62-p16
Lnn62-p18       Lnn62-p16
Lnn68-p1        Lnn68-p3
Lnn68-p2        Lnn68-p3
Lnn68-p3        Lnn68-p6
Lmm18-p9        Lmm18-p6
Lmm18-p10       Lmm18-p9
Lmm18-p11       Lmm18-p12
Lmm18-p12       Lmm18-p9
Lmm23-p15       Lmm23-p17
Lmm23-p16       Lmm23-p17
Lmm23-p17       Lmm23-p14
Lmm23-p18       Lmm23-p17
Lmm23-p20       Lmm23-p21



Содержание

Сообщения в этом обсуждении
"Теряется значение переменной при выходе из цикла"
Отправлено gyn61 , 17-Авг-06 11:03 
#!/bin/sh

while read SwIP SwPlace; do
   while read NetTreeSwPlace NetTreeParent; do
      if [ ${SwPlace} = ${NetTreeSwPlace} ];
then
         Parent=${NetTreeParent}
         echo Этому ${SwPlace} соответствует  ${Parent}
         break
      fi
   done < ./nettree
   echo "----- вне цикла  Этому ${SwPlace} соответствует ${Parent}"

done < ./List


"Теряется значение переменной при выходе из цикла"
Отправлено Pikador , 17-Авг-06 11:26 
>#!/bin/sh
>
>while read SwIP SwPlace; do
>   while read NetTreeSwPlace NetTreeParent; do
>      if [ ${SwPlace} = ${NetTreeSwPlace} ];
>
>then
>         Parent=${NetTreeParent}
>         echo Этому ${SwPlace}
>соответствует  ${Parent}
>         break
>      fi
>   done < ./nettree
>   echo "----- вне цикла  Этому ${SwPlace} соответствует ${Parent}"
>
>
>done < ./List

Хм, как ни странно заработало, спсибо. А в чем причина неработоспособности моего варианта не подскажите?


"Теряется значение переменной при выходе из цикла"
Отправлено gyn61 , 17-Авг-06 11:28 
>Хм, как ни странно заработало, спсибо. А в чем причина неработоспособности моего
>варианта не подскажите?

Там из-за конвейеров порождались субшеллы.


"Теряется значение переменной при выходе из цикла"
Отправлено Pikador , 17-Авг-06 12:19 
>>Хм, как ни странно заработало, спсибо. А в чем причина неработоспособности моего
>>варианта не подскажите?
>
>Там из-за конвейеров порождались субшеллы.


Я предполагал, что они появлялись из-за циклов. А нельзя ли перекидывать переменные между субшелами? Пытался использовать export  да чет не прокатило...

PS К стати, заработало даже при изменении только внутреннего цикла.


"Теряется значение переменной при выходе из цикла"
Отправлено gyn61 , 17-Авг-06 23:51 
>Я предполагал, что они появлялись из-за циклов. А нельзя ли перекидывать переменные
>между субшелами? Пытался использовать export  да чет не прокатило...

Из родительского шелла в субшелл переменные и так передаются. Получить значение переменных из субшелла в родительский шелл стандартными методами невозможно (под нестандартными методами я понимаю трюки с временными файлами, перенаправлением вывода, фифо и т.д.).

>
>PS К стати, заработало даже при изменении только внутреннего цикла.

Ну это понятно. Вам же нужно было значение переменной получить _внутри_ внешнего цикла.


"Теряется значение переменной при выходе из цикла"
Отправлено Pikador , 18-Авг-06 10:56 
>>Я предполагал, что они появлялись из-за циклов. А нельзя ли перекидывать переменные
>>между субшелами? Пытался использовать export  да чет не прокатило...
>
>Из родительского шелла в субшелл переменные и так передаются. Получить значение переменных
>из субшелла в родительский шелл стандартными методами невозможно (под нестандартными методами
>я понимаю трюки с временными файлами, перенаправлением вывода, фифо и т.д.).
>
>
>>
>>PS К стати, заработало даже при изменении только внутреннего цикла.
>
>Ну это понятно. Вам же нужно было значение переменной получить _внутри_ внешнего
>цикла.

Спасибо за содержательный ответ.