导入清单有 5000 行,脚本处理完统计是 4999 条,用 wc -l 看也是 4999,实际最后一个域名没有结尾换行,正好被跳过。碰到这种情况,我一般先确认改动有没有真的生效。
原因不复杂,read 在遇到 EOF 且没有换行符时返回非 0,循环条件不成立,最后一行虽然读进了变量却没进循环体。wc -l 也只数换行符。
「while read 丢行」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。报错里带路径的,先去看那个路径在不在、权限对不对。
while IFS= read -r line || [ -n "$line" ]; do echo "$line" done < domains.txt
同一份配置存在多处的,先确认改的是被加载的那一份。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。
备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。
具体做法是,循环条件写成 while read -r line || [ -n "$line" ];读的时候用 IFS= read -r 保留首尾空白;处理完比对行数和实际处理数;用没有结尾换行的文件跑一次验证。
最后用这个标准收尾,5000 行的文件处理出 5000 条,最后一行没有换行也不漏。
