2

次のコードがあります

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 についての私の理解では、リダイレクトされた for ループは変数を保持する必要があります。私は何を間違っていますか?

4

1 に答える 1

3

まず、スクリプトを単純化します。通常、bash にはもっと良い方法がたくさんあります。また、ほとんどの場合、awk やその他のツールを実行する代わりに、純粋な bash ソリューションに頼ることができます。
次に、デバッグを追加します。これは、デバッグを伴う少しリファクタリングされたスクリプトです

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

より明確になりましたね。:)

于 2013-10-20T15:45:04.560 に答える