Переменная потеря в перенаправленном Bash во время цикла
У меня есть следующий код
for ip in $(ifconfig | awk -F ":" '/inet addr/{split($2,a," ");print a[1]}')
do
bytesin=0; bytesout=0;
while read line
do
if [[ $(echo ${line} | awk '{print $1}') == ${ip} ]]
then
increment=$(echo ${line} | awk '{print $4}')
bytesout=$((${bytesout} + ${increment}))
else
increment=$(echo ${line} | awk '{print $4}')
bytesin=$((${bytesin} + ${increment}))
fi
done < <(pmacct -s | grep ${ip})
echo "${ip} ${bytesin} ${bytesout}" >> /tmp/bwacct.txt
done
Который я хотел бы напечатать увеличенные значения в bwacct.txt, но вместо этого файл полон нулей:
91.227.223.66 0 0
91.227.221.126 0 0
127.0.0.1 0 0
Мое понимание Bash состоит в том, что перенаправленный цикл должен сохранять переменные. Что я делаю неправильно?
1 ответ
Решение
Прежде всего, упростите ваш сценарий! Обычно есть много лучших способов в bash. Также большую часть времени вы можете положиться на чистые решения bash вместо запуска awk или других инструментов.
Затем добавьте отладку! Вот немного переработанный скрипт с отладкой
#!/bin/bash
for ip in "$(ifconfig | grep -oP 'inet addr:\K[0-9.]+')"
do
bytesin=0
bytesout=0
while read -r line
do
read -r subIp _ _ increment _ <<< "$line"
if [[ $subIp == "$ip" ]]
then
((bytesout+=increment))
else
((bytesin+=increment))
fi
# some debugging
echo "line: $line"
echo "subIp: $subIp"
echo "bytesin: $bytesin"
echo "bytesout: $bytesout"
done <<< "$(pmacct -s | grep "$ip")"
echo "$ip $bytesin $bytesout" >> /tmp/bwacct.txt
done
Теперь намного понятнее, а?:)