重定向bash while循环中的变量丢失

重定向bash while循环中的变量丢失,bash,while-loop,process-substitution,Bash,While Loop,Process Substitution,我有以下代码 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 ${lin

我有以下代码

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

我对Bash的理解是重定向的for循环应该保留变量。我做错了什么?

首先,简化您的脚本!在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
#/bin/bash
对于“$(ifconfig | grep-oP'inet addr:\K[0-9.]+]”中的ip
做
bytesin=0
bytesout=0
而read-r行
做

read-r subIp uu uu u增量uu调试的可能重复:如果在循环中回送变量,它们是否包含非零值?这可以通过一些简单的调试轻松解决:打印所有相关变量。注意:为什么您更喜欢笨拙的
${var}
表示法?此循环与最终的
echo
运行在同一个shell中,因此建议的重复项不适用。这并不能解决您的问题,但看起来您可以使用:
大大简化,同时读取ip a b增量c
,并保存所有
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