Добрый день, уважаемые гуру скриптинга. Не объясните, почем 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]}"Вывод внутри цикла - полет нормальный, как только выходим из цикла, весь массив очищается.
Да и все остальные переменные тоже.
>[оверквотинг удален]
>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 запускает цикл в дочернем процессе.
Благодарю. Помогло, правда "выжили" после цикла только задекларированны переменные, внутренние переменные цикла все равно очищаются. Интересное конечно поведение шелла...
>[оверквотинг удален]
>>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 )