在文件结束之前退出循环

在文件结束之前退出循环

我正在读取文件并写入,while 在到达文件末尾之前退出。它始终存在于 n-1。有人能帮助我吗?

答案1

这个问题缺乏细节和实际代码。可能是这样的

while read variable; do …

read能够读取不完整的行,但在这种情况下它会返回失败。因此循环体不会被执行。

POSIX需要尾随换行符才能将任何行视为完整。

3.195 不完整行
文件末尾的一个或多个非 <换行符> 字符序列。

[…]

3.206 行
零个或多个非 <newline> 字符加上终止 <newline> 字符的序列。

Unix/Linux 中的换行符不是行分隔符。它是一行终结者。由于这种惯例,任何文本工具都可能遗漏不完整的行。

您可以使用知道问题的文本编辑器检查并修复输入文件,例如vim

或者你可以修改你的代码。同样的问题是在我们的姊妹网站 U&L SE 上解决

while IFS= read -r line || [ -n "$line" ]; do
    printf '%s\n' "$line"
done <file

[…]

当读取不完整的行时,read将失败,但$line仍包含数据。额外的-n测试将检测到这一点,以便允许循环体输出不完整的行。在那之后的迭代中,read将再次失败并且$line将是一个空字符串,从而终止循环。

相关内容