【问题标题】:reading a file line by line using the shell使用 shell 逐行读取文件
【发布时间】:2020-11-26 18:39:17
【问题描述】:

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

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

我不明白为什么当我们将&lt;input_file 放在done 之后并进入无限循环打印input_file 的第一行当我们将&lt;input_file 放在-r line 之后的第一行时它工作正常他们不应该一样吗?

【问题讨论】:

    标签: shell loops io-redirection ifs


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:
      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 循环,然后读取行与重定向输出的每一行一起发生,直到它到达输出的末尾,然后是文件的末尾。

      另一种处理文件的方法是将 file_input 引入 while 循环:

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

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

      【讨论】:

      • 你不应该宣传 cat 的无用用途。如果要读取多个文件,则很有用。
      猜你喜欢
      • 2016-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-11
      • 2019-03-18
      相关资源
      最近更新 更多