使用 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.
结束
逐行读取 .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.
结束