while 循环中的读取行如何工作

问题描述 投票:0回答:2

我刚刚开始学习 shell,对 read line(variable) 命令如何读取文件感到困惑

done < filename.

代码:

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

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

bash shell while-loop io-redirection
2个回答
10
投票

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

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

这是复合命令

while
:

while TESTCOMMAND; do SOMETHING; done

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

首先,

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

对于每次迭代,都会运行

TESTCOMMAND
,如果成功,则执行
do
done
SOMETHING
部分)之间的命令。如果
TESTCOMMAND
失败,则退出循环。

现在,让我们看看

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

然后执行命令

read

。正是该命令 
read
 将其参数 
LINE
 解释为要写入的变量名。其他命令可以将该单词 (
LINE
) 解释为文件名、文本单词或任何他们想要的内容。

片段的最后一行,

done < inputfile

表示该命令必须重定向其(标准)输入:该命令不会读取标准输入(在许多情况下是控制台),而是读取指定的文件(
inputfile
在这种情况下)。

重定向适用于什么命令?它是

while 命令及其所有“子项”。不要因为重定向符号 <

 似乎与关键字 
while
 相距甚远而感到困惑。 shell 看到 
while
,并且知道稍后有对应的 
done

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

或多或少执行这些行:

while read LINE; do echo "This is a downvote" done < inputfile
像这样(假设输入文件包含 3 行):

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

0
投票

read LINE

返回成功(退出代码0)
无论该行是否为空。仅当到达文件结尾或发生其他错误时才返回'false'(非零退出代码) (详情请参阅下一节)。

文档

来自

help read

退出状态:

返回代码为零,除非文件结束 遇到,读取超时(在这种情况下大于 128), 发生变量赋值错误,或者无效的文件描述符 作为 -u 的参数提供。

© www.soinside.com 2019 - 2024. All rights reserved.