循环中读取文本文件不包括最后一行

时间:2018-01-13 05:54:13

标签: bash loops

我的somelist.txt文件包含以下内容:

a
b
c

使用下面的循环不会在c中返回listing。但是如果我在c之后按下ENTER(新行),循环将完全正确地读取它。有没有办法让它读取最后一行,而不需要在c后有新行?

somelist.txt有效:

a
b
c
(empty line)

代码:

while read list; do
listing="$list"
done <somelist.txt

echo $listing

3 个答案:

答案 0 :(得分:1)

在处理您正在阅读的文件不包含POSIX文件结尾的可能性时。 (意味着它有可能缺少最终'\n'),然后处理解析文件的正确方法是在read语句中添加一个检查,以测试最终读取是否填充了$list。例如:

while read -r list || [ -n "$list" ]; do
    echo "$list"
done <somefile.txt

您可以使用任何您喜欢的测试构造,bash [[ ... ]]或旧的test -n "$list"(相当于[ ... ])。

这样无论你是否有POSIX eof,你都会读到所有的行。 (大多数现代编辑都强制执行POSIX eof,但仍然有很多不支持)

答案 1 :(得分:0)

您需要模仿cat。见http://mywiki.wooledge.org/BashFAQ/001

  while IFS= read -r list; 
  do   
    listing="$list"; 
  done < somelist.txt; 
  [[ -n "$listing" ]] && echo "$listing"

这将打印:c

要打印所有这些内容,请在echo内使用loop

  while IFS= read -r list; 
  do  
    echo "$list"; 
  done < somelist.txt; 
  [[ -n $list ]] && echo "$list"

结果:

 a
 b
 c

答案 2 :(得分:-2)

您正在使用“&lt;”运营商。所以它最终没有到达char。当它到达最后。打破循环。只需改变操作&lt;并使用“=”。并检查