现有代码如下:
#!/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<
温馨提示:答案为网友推荐,仅供参考