加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Bash管道命令输出到sum循环

发布时间:2020-12-15 21:48:45 所属栏目:安全 来源:网络整理
导读:进入bash,我喜欢它,但似乎有很多细微之处最终会在功能方面产生很大的不同,不管怎么说,这就是我的问题: 我知道这有效: total=0for i in $(grep number some.txt | cut -d " " -f 1); do (( total+=i ))done 但为什么不呢?: grep number some.txt | cut -d
进入bash,我喜欢它,但似乎有很多细微之处最终会在功能方面产生很大的不同,不管怎么说,这就是我的问题:

我知道这有效:

total=0
for i in $(grep number some.txt | cut -d " " -f 1); do
    (( total+=i ))
done

但为什么不呢?:

grep number some.txt | cut -d " " -f 1 | while read i; do (( total+=i )); done

some.txt:

1 number
2 number
50 number

for和while循环分别接收1,2和50,但for循环显示总变量最终为53,而在while循环代码中,它只保持为零.我知道我缺少一些基本知识,请帮助我.

例如,我也没有区分管道
如果我跑

grep number some.txt | cut -d " " -f 1 | while read i; echo "-> $i"; done

我得到了预期的输出

-> 1
-> 2
-> 50

但如果这样跑的话

while read i; echo "-> $i"; done <<< $(grep number some.txt | cut -d " " -f 1)

然后输出变为

-> 1 2 50

这对我来说似乎很奇怪,因为grep在单独的行中输出结果.好像这不是模棱两可的,如果我的文件中只有数字1 2 3在不同的行中,我跑了

while read i; echo "-> $i"; done < someother.txt

然后输出将由不同行中的回波打印,如前面示例中所预期的那样.我知道<用于文件和<<<对于命令输出,但为什么存在这种线差异? 无论如何,我希望有人可以对此事有所了解,谢谢你的时间!

解决方法

grep number some.txt | cut -d " " -f 1 | while read i; do (( total+=i )); done

管道中的每个命令都在子shell中运行.这意味着当您将while读取循环放入管道中时,任何变量赋值都将丢失.

见:BashFAQ 024 – “I set variables in a loop that’s in a pipeline. Why do they disappear after the loop terminates? Or,why can’t I pipe data to read?”

while read i; echo "-> $i"; done <<< "$(grep number some.txt | cut -d " " -f 1)"

要保留grep的换行符,请添加双引号.否则$(…)的结果会受到分词的影响,这会将所有空格折叠成单个空格.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读