使用 shell 逐行读取文件

reading a file line by line using the shell

逐行读取 .txt 文件的正确语法是:

while IFS= read -r line
do
    echo "$line"
done < input_file

我不明白为什么当我们在 done 之后放置 <input_file 并在我们放置 [=12] 时进入无限循环打印 input_file 的第一行时它工作正常=] 在第一行的 -r line 之后,它们不应该相同吗?

这是因为while(实际上是命令列表)的条件在每次迭代上执行和评估,包括重定向。 done 之后的重定向在整个循环结构中只发生一次。

所以在第一种情况下,read 总是读取新打开的文件的第一行 input_file,而在第二种情况下,它一直从同一个文件描述符 (stdin) 读取行。

while IFS= read -r line < input_file
do
    echo "$line"
done

在这种情况下,您将在循环的每次迭代中重新启动对 input_file 的读取。当 read 逐行读取时,每次重新初始化都会打印第一行。由于您永远不会超过第一行,因此它只会无限期地打印第一行

while IFS= read -r line
do
    echo "$line"
done < input_file

在这种情况下,input_file 被重定向到 while 循环,然后读取行与重定向输出的每一行一起发生,直到它到达输出的末尾,然后结束文件。

另一种处理文件的方法是 cat file_input 到 while 循环:

cat input_file | while IFS= read -r line
do
    echo "$line"
done

这与上一节的工作方式相同,但由于管道的原因效率较低。输出流从左到右而不是从右到左。这通常更容易理解。 cat input_file 的输出被馈送到(管道)到 while 循环中,并且读取每一行直到 output/file.

结束