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

现有代码如下:#!/bin/shsum=0/usr/bin/lua/root/test.lua2>&1|grep-A3-B2src$'\t'192.168.1.5|gre... 现有代码如下:

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

问:为什么现有代码(使用管道)得不到累加结果,而使用文件读取方式则正确?如果必须使用管道,怎么修改?
补充:本脚本目的是通过一系列命令,输出一个字符串,字符串内容是每行一个纯数字,通过逐行读取,计算各行数字的和
展开
 我来答
yss624_
2015-11-02 · TA获得超过4.7万个赞
知道大有可为答主
回答量:9775
采纳率:77%
帮助的人:2570万
展开全部
因为使用管道后,生成了一个子shell,子shell里面的变量和外面的变量不是同一个变量,虽然变量名称是一样的。所以循环结束后,父shell的变量仍然没有变动。
追问
那么能不能把子shell的变量往父shell传?
追答
用第二种方法, 不要用管道:
while
do
..
done<
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式