Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash管道命令输出到sum循环中_Bash_Piping - Fatal编程技术网

Bash管道命令输出到sum循环中

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

进入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)
我觉得这很奇怪,因为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)"