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

Исходное сообщение
"bash теряет значения переменных после while"

Отправлено mdmitriy , 28-Мрт-08 09:09 
Добрый день, уважаемые гуру скриптинга. Не объясните, почем bash теряет значения переменных после цикла while do. И как этого избежать. Заранее благодарен. Кусок скрипта далее:

snmpwalk -c public 192.168.1.1 1.3.6.1.2.1.17.4.3.1.2 | while read line
do
length=${#line}
position=$(($length-1))
port_number=${line:$position:1}
mac_number[8]=10
#echo ${mac_number[8]}
done
echo "${mac_number[8]}"

Вывод внутри цикла - полет нормальный, как только выходим из цикла, весь массив очищается.
Да и все остальные переменные тоже.


Содержание

Сообщения в этом обсуждении
"bash теряет значения переменных после while"
Отправлено stas , 28-Мрт-08 09:48 
>[оверквотинг удален]
>position=$(($length-1))
>port_number=${line:$position:1}
>mac_number[8]=10
>#echo ${mac_number[8]}
>done
>echo "${mac_number[8]}"
>
>Вывод внутри цикла - полет нормальный, как только выходим из цикла, весь
>массив очищается.
>Да и все остальные переменные тоже.

Попробуйте так:
while read line
do
length=${#line}
position=$(($length-1))
port_number=${line:$position:1}
mac_number[8]=10
#echo ${mac_number[8]}
done < <(snmpwalk -c public 192.168.1.1 1.3.6.1.2.1.17.4.3.1.2)
echo "${mac_number[8]}"

Как у вас, bash запускает цикл в дочернем процессе.


"bash теряет значения переменных после while"
Отправлено mdmitriy , 28-Мрт-08 10:28 
Благодарю. Помогло, правда "выжили" после цикла только задекларированны переменные, внутренние переменные цикла все равно очищаются. Интересное конечно поведение шелла...



"bash теряет значения переменных после while"
Отправлено Oyyo , 28-Мрт-08 10:29 
>[оверквотинг удален]
>>position=$(($length-1))
>>port_number=${line:$position:1}
>>mac_number[8]=10
>>#echo ${mac_number[8]}
>>done
>>echo "${mac_number[8]}"
>>
>>Вывод внутри цикла - полет нормальный, как только выходим из цикла, весь
>>массив очищается.
>>Да и все остальные переменные тоже.

======
>
>Попробуйте так:
>while read line
>do
>length=${#line}
>position=$(($length-1))
>port_number=${line:$position:1}

=====
>mac_number[8]=10
>#echo ${mac_number[8]}
>done < <(snmpwalk -c public 192.168.1.1 1.3.6.1.2.1.17.4.3.1.2)
>echo "${mac_number[8]}"
>
>Как у вас, bash запускает цикл в дочернем процессе.

ну, и с тем же успехом

всё, что обрабатывается внутри процесса по окнчании процесса не сохраняется и не может сохранится (разве что, значения из последней строки цикла, но баш этого не делает)
создав переменную до начала процесса, обработай её внутри процесса, по окончании переменная принимает то значение которое было до начала процесса
ВЫВОД - если нужно сохранить массив после окончания процесса "while", создайте его до начала процесса
i=( snmpwalk -c public 192.168.1.1 1.3.6.1.2.1.17.4.3.1.2 )