Bash管道命令输出到sum循环中
进入bash,我喜欢它,但似乎有很多微妙之处最终会在功能上产生巨大的差异,等等,总之,我的问题是: 我知道这是可行的:Bash管道命令输出到sum循环中,bash,piping,Bash,Piping,进入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 num
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)
我觉得这很奇怪,因为grep在单独的行中输出结果。好像这不是含糊不清的,如果我有一个文件,在单独的行中只有数字1、2、3,然后我运行
while read i; echo "-> $i"; done < someother.txt
阅读时;回声“->$i”;done
然后,输出将由echo以不同的行打印,如前一个示例中所预期的那样。我知道这是为了文件和文件
管道中的每个命令都在子shell中运行。这意味着当您将while read
循环放入管道中时,任何变量赋值都将丢失
见:
阅读时
;回声“->$i”;另一种选择是set+m;shopt-s lastpipe
,但这真的让事情变得一团糟。作为第二个问题中的一个简单例子,请尝试:a=$'foo\nbar';echo$a;回声==;echo“$a;echo===;cat您还可以使用awk:awk'{a+=$1}END{print a}some.txt计算第一列的和
while read i; echo "-> $i"; done < someother.txt
grep number some.txt | cut -d " " -f 1 | while read i; do (( total+=i )); done
while read i; echo "-> $i"; done <<< "$(grep number some.txt | cut -d " " -f 1)"