【问题标题】:Using bash for loop to iterate through file使用 bash for 循环遍历文件
【发布时间】:2021-01-15 22:42:14
【问题描述】:

我可以遍历文件 a.txt,在每一行上执行任意命令(在本例中为 echo)

xargs -n1 echo < a.txt

for a in $(cat a.txt); do echo $a; done

为什么我不能做类似的事情

for arg do echo $arg; done < a.txt

返回成功但没有输出?

【问题讨论】:

  • for arg 更改为while read arg;,它应该可以满足您的需求。
  • 谢谢,确实如此。我只是想知道类似于上述循环的 for 循环是否可行。如果不是,为什么。
  • on each line by doing xargs -n1 不适用于包含奇数个 ' 或/和奇数个 " 的行。 or for a in $(cat a.txt) 不适用于单词之间有空格或制表符的行。
  • for arg; do ... 等价于for arg in "$@"; do ...。它不从输入流中获取值,而是从位置参数中获取值。

标签: bash loops


【解决方案1】:

for 循环从其in 子句或$@ 的内容中获取其迭代值;它不从标准输入读取。

在您的最后一个示例中,整个命令的标准输入从 a.txt 重定向,它不会产生任何输出,因为 for 不会从标准输入读取,并且它的命令块的命令也不会。

但是,read 命令确实从标准输入读取,这就是 while read arg; 循环起作用的原因。

感谢 Glenn 解释了没有 in 子句的 for 命令的含义:

$@ 的值为空,这就是您的for 循环不产生输出的原因。从文件重定向命令的标准输入不会设置$@。如果您将for 循环放在脚本中并使用一些参数执行它,那么您的for 循环将打印命令行的参数而不是a.txt 的内容。

【讨论】:

  • for arg do ... 隐式使用位置参数,相当于for arg in "$@"; do
  • @glennjackman 我想知道为什么它在 stderr 上什么也没产生。现在我知道了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-19
  • 1970-01-01
  • 2013-04-08
  • 2020-06-17
  • 1970-01-01
  • 2020-11-17
  • 1970-01-01
相关资源
最近更新 更多