Question

I have the following code

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

Which I would like to print the incremented values to bwacct.txt, but instead the file is full of zeroes:

91.227.223.66 0 0
91.227.221.126 0 0
127.0.0.1 0 0

My understanding of Bash is that a redirected for loop should preserve variables. What am I doing wrong?

Was it helpful?

Solution

First of all, simplify your script! Usually there are many better ways in bash. Also most of the time you can rely on pure bash solutions instead of running awk or other tools.
Then add some debbuging! Here is a bit refactored script with debugging

#!/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

Much clearer now, huh? :)

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top