【问题标题】:bash: will the read command recive input from an empty command?bash:读取命令会接收来自空命令的输入吗?
【发布时间】:2017-11-14 02:24:26
【问题描述】:

bash 新手。我想要一个“while read line”循环从命令获取输入 - 在这种情况下,grep。我希望读取读取 grep 返回的每一行并将其作为字符串插入到“行”变量中。如果 grep 没有返回结果,我仍然希望它进入循环,这样我就可以 printf 一些东西然后继续。它会起作用吗?这是代码段:

while read -r line: do

    ...(irrelevent)...

        done<$(grep $id ${arrpre[$j]}.course)

${arrpre[$j]}.course 是文件的名称。求救!

【问题讨论】:

  • 您是要从grep 的输出中读取,还是从名为grep 输出的文件 中读取?这段代码在做后者。
  • ...如果您希望循环遍历输出本身,则可以是 done &lt; &lt;(grep ...)done &lt;&lt;&lt;"$(grep ...)"
  • ... 或grep ... | while ...
  • @JohnBollinger,...尽管这会受到BashFAQ #24 中描述的陷阱的影响。
  • 是的,@CharlesDuffy,在这方面,循环体确实不是无关的。

标签: bash input command


【解决方案1】:

[I]n 如果 grep 没有返回结果,我仍然希望它进入循环,这样我就可以 printf 一些东西然后继续。会有用吗?

没有。如果您将命令的输出(即grep)传送到while 循环中,并且该命令根本不产生任何输出,那么read 将在第一次执行时看到文件结尾。 read 在遇到文件结束时返回一个失败代码,这将导致循环终止而不执行其主体。如果不是这种情况,那么无论是否有任何数据要读取,您都将在每种情况下都进行一次额外的 while 循环迭代。

但是你可以明确记录循环体是否曾经被执行过,然后采取适当的行动。例如:

empty=1
while read -r line: do
  empty=0
  #  ...
done < $(grep $id ${arrpre[$j]}.course)

if [ $empty -eq 1 ]; then
  # ... stuff to do in the event of empty grep output
fi

【讨论】:

  • &lt; $(grep ...),不是&lt; &lt;(grep ...)&lt;&lt;&lt;"$(grep ...)"?我认为您正在传播 OP 在这里犯的错误。
  • 帮助很大! tnx 很多
  • 我刚刚复制了 OP 的代码,@CharlesDuffy。这可能是不正确的,但这不是问题所在。
  • @JohnBollinger,...不是必要,但我敢肯定,把零钱押在上面是不正确的。 :)
  • 如果您真的想执行相同的代码(循环中的内容),而不是将其作为单独的if 块重复,请使用while read -r line || [ "$empty" -eq 1 ]; do
猜你喜欢
  • 2015-05-16
  • 2013-01-28
  • 2012-05-04
  • 1970-01-01
  • 2012-08-31
  • 1970-01-01
  • 2014-09-22
  • 2017-04-11
  • 2014-11-17
相关资源
最近更新 更多