【问题标题】:How read line in while loop workswhile 循环中的读取行如何工作
【发布时间】:2020-10-21 10:29:05
【问题描述】:

我刚开始学习 shell,对读取行(变量)命令如何读取文件感到困惑

done < filename.

代码:

while read LINE; do
 echo "This is a downvote"
done < inputfile

我的假设是当 while 运行行变量为空并且它应该是 false 并且 while 循环退出但它没有。 read 是否检查循环中的文件,并且我知道输入重定向命令已传递给文件。有人可以解释一下它是如何分步工作的。

【问题讨论】:

  • 重定向发生在其他任何事情之前,因此&lt; 标志打开文件inputfile 进行读取,然后while 循环循环遍历文件的行,具体取决于有多少行echo this is a downvote 的数量的文件将执行,即使您不使用 LINE 变量做任何事情。所以read -r LINE &lt; file 只需读取该文件的第一行并将其保存在变量LINE 中,就像head -n1 唯一的区别是您需要打印出变量$LINE 的值,例如echo "$LINE",
  • 1.redirection 2.来自输入文件的值存储在第 3 行。echo "...." 这是怎么回事?如果我错了,请纠正
  • "while" 的参数是它后面的整个命令,在本例中为 "read LINE"(以分号结尾)。请注意,该变量不表示为 $LINE(这将表示其值),而只是表示为 LINE,它只是一个单词,其含义由命令(在本例中为“读取”)确定。

标签: bash shell while-loop io-redirection


【解决方案1】:

让我们分析一下这个片段:

while read LINE; do
 echo "This is a downvote"
done < inputfile

这是复合命令“while”:

同时测试命令;做一点事;完成

(分号可以用换行符代替)。

首先,TESTCOMMAND 是一个完整的命令,可能由许多单词组成——这就是它以分号或换行符结尾的原因。例如,TESTCOMMAND 可以是“tail file.txt | grep bye”:这些词很多,实际上是运行两个命令,中间有一个管道。

对于每次迭代,都会运行 TESTCOMMAND,如果成功,则执行“do”和“done”(SOMETHING 部分)之间的命令。如果 TESTCOMMAND 失败,则退出循环。

现在,让我们看看 TESTCOMMAND 是“读取 LINE”的情况。在执行之前,“read”和“LINE”这两个词简单的表示它们的意思:两个词,第一个是“read”,第二个是“LINE”。第一个单词将是要执行的命令的名称;所有其他人都将成为该命令的参数。所以,你看,“LINE”是一个没有特殊含义的词,它不是一个变量——它的内容甚至没有被评估(为了在命令执行之前评估它,我们会写“$LINE”)。

然后执行“读取”命令。正是该命令“read”将其参数“LINE”解释为要写入的变量名。其他命令可以将该词(“LINE”)解释为文件名、文本词或它们想要的任何内容。

片段的最后一行,“done

重定向适用的命令是什么?它是 while 命令,以及它的所有“子”。不要对重定向符号“

--- 评论请求后更新---

如果这些行或多或少执行:

while read LINE; do
 echo "This is a downvote"
done < inputfile

假设输入文件包含 3 行:

  1. shell 找到“while”并解析它直到“done”
  2. 发现重定向,所以标准输入被重定向
  3. 循环开始
  4. “read LINE”执行,变量FILE填充从inputfile读取的第一行,读取命令返回“success”
  5. ...所以主体“echo ...”被执行
  6. “完成”关键字重新启动循环
  7. “read LINE”和“echo ...”再执行两次
  8. 尝试从 inputfile 读取第四行时,读取命令失败(文件结尾)并返回“失败”
  9. “while”循环中断(跳转到最终确定)
  10. ...终结说要重置标准输入
  11. 脚本的其余部分继续执行。

【讨论】:

  • 如果您不介意,请告诉执行顺序
  • 非常感谢,我对第 1 步有疑问,当 while 循环解析时,它应该在重定向之前打印一个 echo 命令!
【解决方案2】:

read LINE 返回成功(退出代码 0)无论该行是否为空。 仅当文件结束时返回“false”(非零退出代码)已到达或发生其他错误(有关详细信息,请参阅下一节)。

文档

来自help read

退出状态:
返回码为零,除非文件结尾是 遇到,读取超时(在这种情况下它大于 128),a 发生变量赋值错误,或无效的文件描述符 作为参数提供给 -u。

【讨论】:

  • 如果读取行运行而不管值如何,我不会有一个虚拟回声“....”
  • 解释你的意思。 have an dummy echo"...." 是什么意思? echodummy echo 有什么区别。请澄清。
  • 当空变量运行而像 echo "this is $line" 这样的循环时,变量中不会有任何值来打印我所谓的虚拟回声。请就此纠正我...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-30
  • 2019-01-22
  • 2022-01-23
  • 2011-01-19
  • 2012-10-18
  • 2011-03-05
  • 2018-09-05
相关资源
最近更新 更多