【问题标题】:File redirection for loops in the shellshell中循环的文件重定向
【发布时间】:2016-04-06 11:09:22
【问题描述】:

我试图了解循环的文件重定向如何在 shell 中工作,所以我编写了以下代码:

#!/bin/sh
while IFS='' read -r line; do
  echo 'reading '$line
  awk -F, '{sub(/.*/,"Completed",$2);print}'
done<$1

我给脚本提供了以下输入文件:

hello,hi,how are you
i,am,good

对上述文件运行脚本的输出为:

reading hello,hi,how are you
i Completed good

我期待表单的输出:

reading hello,hi,how are you
hello,Completed,how are you
i Completed good
reading i,am,good
hello,Completed,how are you
i Completed good

为什么循环没有为两行打印“阅读”?而且,为什么第一行没有用 awk 替换?谁能解释一下脚本的输出?

【问题讨论】:

  • 你的awk命令将从标准输入读取,在这种情况下是$1的重定向:所以read读取$1的第一行,然后awk读取剩余的行。也许你希望awk -F, '{sub(/.*/,"Completed",$2);print}' &lt;&lt;&lt; "$line"$line 的内容发送给awk
  • 为什么这条评论不是答案? :)

标签: shell awk stdin io-redirection


【解决方案1】:

只有一个stdin 在循环中重定向。 readawk 都将从 stdin 读取。 read 只消耗一行(第一行),awk 愉快地消耗了其余的。

在下一次迭代中,read 没有更多内容可读取,循环终止。

如果您想在awk 的标准输入上提供数据,您必须明确地这样做,例如通过管道进入awkprintf '%s\n' "$line" | awk ...

【讨论】:

    猜你喜欢
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 2018-04-24
    • 2018-02-20
    • 2013-07-17
    • 2014-06-02
    相关资源
    最近更新 更多