技术与生活 / 一篇记录
逐行读文件时,别吃掉反斜杠和空格
反斜杠可能被 read 解释,使用 -r 可以避免它作为转义符被消费。
文本行常常包含路径、正则表达式或缩进,读取时不应未经约定就把它们重新解释。清空 IFS 与启用 read -r,分别处理首尾分隔字符和反斜杠的问题。
操作与观察
以下示例使用 Bash,请在独立测试目录中理解输入、输出和退出码。
printf '%s\n' 'a\b' | while IFS= read -r line; do printf '%s\n' "$line"; done
检查反斜杠和前后空格是否保留。
准备一行带前导空格、一行带反斜杠的样本,比较处理前后。还要单独考虑文件最后一行没有换行的情况,简单循环可能遗漏它。
需要保留末尾无换行的最后一行时,循环条件可以同时检查 read 是否成功以及变量是否仍有内容。加入这一边界之前,应先确认空行与结束标记在输入协议中的实际含义。
别遗漏这条边界
管道中的循环可能运行在子 Shell 中,不适合依赖外部变量更新。
参考:Shell 文档。