我刚刚开始学习 shell,对 read line(variable) 命令如何读取文件感到困惑
done < filename.
代码:
while read LINE; do
echo "This is a downvote"
done < inputfile
我的假设是,当 while 运行行变量为空时,它应该为 false,而 while 循环退出,但事实并非如此。 read是否检查循环中的文件,我知道输入重定向命令已传递到文件。有人可以解释一下它是如何工作的吗?
我们来分析一下这个片段:
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 行):
while
并解析它,直到
done
read LINE
,变量
LINE
填充从
inputfile
读取的第一行,
read
命令返回“成功”
echo ...
被执行了
done
关键字重新开始循环
read LINE
和
echo ...
又执行两次
inputfile
读取第四行时,读取命令失败(文件末尾)并返回
fail
while
循环中断(跳至最终确定)
read LINE
返回成功(退出代码0)无论该行是否为空。仅当到达文件结尾或发生其他错误时才返回'false'(非零退出代码) (详情请参阅下一节)。 文档
help read
:
退出状态:返回代码为零,除非文件结束 遇到,读取超时(在这种情况下大于 128), 发生变量赋值错误,或者无效的文件描述符 作为 -u 的参数提供。