Bash脚本读取外部文件变量后echo输出异常,求助原因分析
Bash脚本source文件后echo输出异常问题解析
问题场景
你有一个内容如下的源文件:
fname=john lname=wick
编写Bash脚本读取该文件并输出变量:
#!/bin/bash source /home/john/automation/sourcefile echo "Name is ${fname} ${lname}"
但执行脚本后得到异常输出:
wickis john
原因分析
出现这种问题的核心原因是源文件使用了Windows风格的换行符\r(Linux/Unix系统默认使用\n作为换行符)。
当Bash执行source命令加载文件时,会把lname=wick\r整行作为变量定义处理,导致lname的实际值是wick\r。其中\r是回车控制字符,它的作用是将输出光标移到当前行的开头位置。
当执行echo "Name is ${fname} ${lname}"时,实际输出的内容是Name is john wick\r:
- 先输出
Name is john wick - 遇到
\r,光标跳转到行首 - 已经输出的
Name is会被后续内容覆盖,最终呈现出wickis john的异常结果。
解决办法
只需将源文件转换为Linux/Unix风格的换行符即可,常用方法如下:
- 使用
dos2unix工具转换:dos2unix /home/john/automation/sourcefile - 用
sed命令去除行尾的\r:sed -i 's/\r$//' /home/john/automation/sourcefile - 通过Vim编辑器修改:打开文件后执行
:set fileformat=unix,再保存退出(:wq)。
内容的提问来源于stack exchange,提问作者isrikanthd
相关产品推荐
相关产品推荐

