Bash 管道命令输出到求和循环
Bash piping command output into sum loop
进入 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循环显示total变量最后是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
然后输出将由 echo 在不同的行中打印,正如前面示例中所预期的那样。我知道 < 用于文件而 <<< 用于命令输出,但为什么存在行差异?
无论如何,我希望有人能对此事有所了解,谢谢您的宝贵时间!
grep number some.txt | cut -d " " -f 1 | while read i; do (( total+=i )); done
管道中的每个命令在子 shell 中都是 运行。这意味着当您将 while read
循环放入管道时,任何变量赋值都会丢失。
while read i; echo "-> $i"; done <<< "$(grep number some.txt | cut -d " " -f 1)"
要保留 grep
的换行符,请添加双引号。否则 $(...)
的结果会受到单词拆分的影响,这会将所有空格折叠成单个空格。
进入 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循环显示total变量最后是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
然后输出将由 echo 在不同的行中打印,正如前面示例中所预期的那样。我知道 < 用于文件而 <<< 用于命令输出,但为什么存在行差异?
无论如何,我希望有人能对此事有所了解,谢谢您的宝贵时间!
grep number some.txt | cut -d " " -f 1 | while read i; do (( total+=i )); done
管道中的每个命令在子 shell 中都是 运行。这意味着当您将 while read
循环放入管道时,任何变量赋值都会丢失。
while read i; echo "-> $i"; done <<< "$(grep number some.txt | cut -d " " -f 1)"
要保留 grep
的换行符,请添加双引号。否则 $(...)
的结果会受到单词拆分的影响,这会将所有空格折叠成单个空格。