source导入的变量输出异常原因及解决方法求助
问题原因与解决办法
原因分析
问题出在foo.config文件的换行符格式上:该文件使用了Windows风格的CRLF换行符(\r\n),而非Linux/Unix系统默认的LF换行符(\n)。
当通过source加载配置文件时,变量mypath的实际值会带上末尾的回车符\r,变成"/home/my/path"\r。执行echo "${mypath}ABC"时,\r会触发终端光标跳转到当前行开头,后续输出的ABC会覆盖掉/home/my/path的前3个字符,最终出现ABCme/my/path的异常结果。而直接在脚本内声明变量时,使用的是Unix换行符,不会引入\r,因此结果正常。
解决办法
方法1:转换配置文件为Unix换行格式
- 使用
dos2unix工具直接转换(大部分Linux发行版预装):dos2unix foo.config - 若没有
dos2unix,用sed命令删除行尾的\r:sed -i 's/\r$//' foo.config - 或用
tr命令处理:tr -d '\r' < foo.config > foo.config.tmp && mv foo.config.tmp foo.config
方法2:在脚本内清理变量中的回车符
如果无法修改配置文件,可在source后对变量做处理,移除末尾的\r:
#!/bin/bash source foo.config # 用参数扩展移除回车符 mypath=${mypath%$'\r'} echo "${mypath}ABC"
或者用tr命令处理:
#!/bin/bash source foo.config mypath=$(echo "$mypath" | tr -d '\r') echo "${mypath}ABC"
内容的提问来源于stack exchange,提问作者lida ZHAO
相关产品推荐
相关产品推荐

