linux shell中,循环相加,为何循环体外得不出结果?

现有代码如下:

#!/bin/sh
sum=0

/usr/bin/lua /root/test.lua 2>&1 | grep -A3 -B2 src$'\t'192.168.1.5 | grep bytes | grep -oE [0-9]+ | while read line
do
sum=$(($sum+$line))
echo "L:$line S=$sum"
done

echo "bye sum=$sum"

运行结果如下

如果代码修改为如下,则结尾的sum可以得到累加结果:

/usr/bin/lua /root/test.lua 2>&1 | grep -A3 -B2 src$'\t'192.168.1.5 | grep bytes | grep -oE [0-9]+ > /tmp/a.txt

while read line
do
sum=$(($sum+$line))
echo "L:$line S=$sum"
done</tmp/a.txt

echo "bye sum=$sum"

问:为什么现有代码(使用管道)得不到累加结果,而使用文件读取方式则正确?如果必须使用管道,怎么修改?
补充:本脚本目的是通过一系列命令,输出一个字符串,字符串内容是每行一个纯数字,通过逐行读取,计算各行数字的和

因为使用管道后,生成了一个子shell,子shell里面的变量和外面的变量不是同一个变量,虽然变量名称是一样的。所以循环结束后,父shell的变量仍然没有变动。追问

那么能不能把子shell的变量往父shell传?

追答

用第二种方法, 不要用管道:
while
do
..
done<

温馨提示:答案为网友推荐,仅供参考

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网