我试图理解shell的文件重定向是如何在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没有发生在第一线?有人可以解释一下脚本的输出吗?
答案 0 :(得分:1)
您只能在循环中重定向一个stdin
。 read
和awk
都将从stdin
中读取。虽然read
只占用一行(第一行),但awk
很乐意消耗剩余的一行。
在下一次迭代中,read
没有其他内容可读,循环终止。
如果您想提供awk
的标准输入数据,您必须明确地这样做,例如:通过awk
汇总到printf '%s\n' "$line" | awk ...
。