Plainnotes

while read 循环丢掉最后一行

2024-05-01 · 2 分钟工具

处理文本时:

while read -r line; do echo "$line"; done < file.txt

如果文件最后一行没有换行符,这一行会被跳过。因为 read 在遇到 EOF 且没有读到换行时返回非零,while 就退出了。

修法:

while read -r line || [ -n "$line" ]; do ... done < file.txt

或者先确保文件以换行结尾。很多生成工具(某些语言的 write)默认不加末尾换行,跨工具处理时特别容易踩。

-r 也不能省,否则反斜杠会被解释成转义,路径里的 \ 会被吃掉。

管道版本还有个子 shell 的坑:cat file | while read ... 里的变量在循环外读不到,用进程替换 < <(...) 或者直接重定向。