Bash中while循环为何无法读取最后一行输入?
Bash while循环丢失最后一行输入的解决办法
问题场景
用while read循环读取标准输入内容并输出时,最后一行总是没被处理:
测试脚本
#!/usr/bin/env bash while read -r num; do echo $num done
输入内容
4 1 2 9 8
实际输出
4 1 2 9 # Last input is missing :(
期望输出
4 1 2 9 8
问题根源
read命令默认以换行符作为行结束标记。如果输入的最后一行没有以换行符结尾,或者输入流在最后一行内容后直接终止,read会把这行内容存入变量,但返回非零状态码——while循环会因为这个非零状态直接退出,跳过最后一次输出操作。
修复方案
方案一:增强循环条件(推荐)
修改循环条件,让read失败时,只要变量非空就继续处理:
#!/usr/bin/env bash while IFS= read -r num || [[ -n $num ]]; do echo "$num" done
IFS=:避免读取的行首尾空格被自动截断|| [[ -n $num ]]:补充判断,确保最后一行内容即使没有换行符也能被输出
方案二:循环后补处理
在循环结束后,单独检查变量是否还有未输出的内容:
#!/usr/bin/env bash while read -r num; do echo "$num" done [[ -n $num ]] && echo "$num"
内容的提问来源于stack exchange,提问作者getimad
相关产品推荐
相关产品推荐

