shell中for循环中的变量为何在done后面echo输出不正确

一个文件,名字为test,里面的内容是:1234234534564567我想要算出第三列的值的和。我自己的代码如下:#!/bin/bashj=0cattest|while... 一个文件,名字为test,里面的内容是:
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7

我想要算出第三列的值的和。
我自己的代码如下:
#!/bin/bash
j=0
cat test |while read line
do
i=`echo "$line" |awk '{print $3}'`
j=$[j+i]
echo $j
done
echo $j
但是输出的结果:
[root@localhost test]# ./t.sh
3
7
12
18
0
也就是说,我希望在for完了之后输入结果,不知道为什么输出的还是0.而不是18
展开
 我来答
acrofox
推荐于2018-05-11 · TA获得超过577个赞
知道小有建树答主
回答量:346
采纳率:0%
帮助的人:299万
展开全部

定义为环境变量没有用的,环境变量只是在子进程创建的时候可以从父进程复制到子进程,它无法实现从子进程往父进程传递,也不能在子进程运行期间从父进程获得新值。

 

解决的办法就是不要产生子进程,改成:

while read line

do

        i=`echo "$line" |awk '{print $3}'`

        j=$[j+i]

        echo $j

done < test
百度网友4706d78
2014-04-18 · TA获得超过563个赞
知道小有建树答主
回答量:407
采纳率:50%
帮助的人:327万
展开全部
这是因为管道的右边是在subshell中执行的,“j=0”这个语句定义的变量j和while里面的j不是同一个变量
可以将j设定为环境变量,即这样定义:
export j=0
这样两地方的j就是使用的同一个变量了
追问
修改为:
#!/bin/bash

export j=0
cat test |while read line
do
i=`echo "$line" |awk '{print $3}'`
j=$[j+i]
echo $j
done
echo $j
输出结果还是一样啊。。。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式