Shell脚本使用while循环逐行读取文件时字符n丢失问题
问题根因及解决方案
根因说明
- 当前执行脚本的shell不支持
$'...'格式的ANSI-C转义语法,你写的IFS=$'\n'没有将IFS(内部字段分隔符)设置为仅换行符,反而将$、\、n三个字符都加入了IFS的分隔字符列表。 echo $line没有给变量加双引号,触发了shell的默认字段分割逻辑,会把变量值中所有属于IFS的字符替换为空格,这就是所有n字符都变成空格的直接原因。
解决方案
方案1:使用bash执行脚本(推荐)
如果你不需要兼容POSIX标准的sh,直接指定用bash运行即可:
- 在脚本开头添加shebang声明:
#!/bin/bash - 执行脚本时使用
bash 你的脚本名.sh,不要用sh 你的脚本名.sh - 给变量引用加上双引号,修改后的循环代码如下:
while IFS=$'\n' read -r line; do echo "$line"; done < namespaces.txt
方案2:兼容POSIX sh的写法
如果需要适配所有POSIX兼容的shell,替换IFS的设置方式,同时给变量加双引号:
# 直接将换行符写入IFS,不需要转义语法 IFS=' ' while read -r line; do echo "$line"; done < namespaces.txt
内容的提问来源于stack exchange,提问作者user3817206
相关产品推荐
相关产品推荐

