Bash中含变量的echo输出异常:末尾内容丢失的原因与解决
问题原因及解决方法
原因分析
从xxd data.txt的输出能看到,文件每行结尾是0d0a,对应Windows系统的换行格式CRLF(回车符\r+换行符\n)。
使用read line < data.txt读取时,read命令默认只会剔除换行符\n,但会保留回车符\r在变量$line中。执行echo "context${line}context"时,\r会让终端光标跳回当前行开头,后面的context会从行首开始输出,直接覆盖前面的部分内容,最终你看到的就只有contextB07G1W8SHN。
解决办法
方法1:读取时清除回车符
读取后手动剔除变量里的\r:
read -r line < data.txt line=${line%$'\r'} # 移除末尾的回车符 echo "context${line}context"
或者用tr提前过滤文件里的\r:
read -r line < <(tr -d '\r' < data.txt) echo "context${line}context"
方法2:转换文件为Unix换行格式
用dos2unix工具直接转换文件(系统未安装可通过包管理器添加):
dos2unix data.txt
转换后文件换行变为Unix格式的\n,再用原read命令读取就不会有问题。
方法3:用awk处理
awk会自动处理CRLF格式的换行,直接输出目标内容:
awk '{print "context"$0"context"}' data.txt
内容的提问来源于stack exchange,提问作者Nighel
相关产品推荐
相关产品推荐

