循环读取无换行结尾的文本文件时,最后一行无法读取如何解决?
解决
while read无法读取无末尾换行文件最后一行的问题 这个坑我之前踩过!核心原因是read命令的工作机制:它只有在成功读取到换行符时才会返回0(成功状态),如果文件最后一行没有结尾的换行符,read虽然会把那行内容赋值给变量,但执行完后会返回非零状态,导致while循环直接终止,最后一行的内容就被漏掉了。
下面给你几个实用的解决方案:
方案1:修改循环条件,兜底处理非空行
直接在while的条件里加一个判断,即使read返回失败,只要变量不为空就执行循环体:
while read list || [[ -n $list ]]; do listing="$list" done < somelist.txt echo "$listing"
原理:当最后一行没有换行时,read读完内容后返回失败,但$list已经被赋值为最后一行的文本,[[ -n $list ]]会判断变量非空,从而让循环体执行,把最后一行内容存入listing。
方案2:保留行内空格的安全写法
如果你的行内容包含首尾空格或者特殊字符,推荐加上IFS=和-r选项,避免read自动截断空格或转义反斜杠:
while IFS= read -r list || [[ -n $list ]]; do listing="$list" done < somelist.txt echo "$listing"
IFS=:保留行首和行尾的空格(默认read会去掉首尾的空白字符)-r:禁止反斜杠的转义功能,避免行内的\被意外处理
为什么原来的代码会失效?
你原来的循环:
while read list; do listing="$list" done <somelist.txt echo $listing
只有当read成功读取到换行符时,才会进入循环体。最后一行没有换行的话,read虽然拿到了内容,但返回状态是失败,循环直接退出,那行内容根本没机会被赋值给$listing。
内容的提问来源于stack exchange,提问作者Gregor Isack
相关产品推荐
相关产品推荐

