RedHat环境下Bash脚本变量拼接异常问题求助
问题描述
在RedHat Linux环境中,名为setup的Bash脚本包含以下代码:
#!/bin/bash #CASE_C3 export RUN_FILES_LOCATION="./Run_Files/" export CPP_FILE="${RUN_FILES_LOCATION}/APP77.ME" echo $CPP_FILE
执行source setup后得到输出:
/APP77.MEes/
预期输出应为:
./Run_Files//APP77.ME
变量出现逐字节覆盖而非拼接的情况,直接在终端执行相同代码正常,仅在脚本运行时出现问题。
问题原因与解决方法
这是因为脚本文件使用了Windows风格的CRLF换行符(\r\n),Bash解析时会将每行末尾的\r(回车符)保留在变量值中。
当RUN_FILES_LOCATION="./Run_Files/"被赋值时,实际值是./Run_Files/\r。后续拼接/APP77.ME时,\r会让光标回到行首,导致/APP77.ME覆盖掉前面的字符,最终出现/APP77.MEes/的异常输出(es/是./Run_Files/中未被完全覆盖的剩余部分)。
解决方法:
- 使用
dos2unix工具转换脚本格式:dos2unix setup - 若没有
dos2unix,可以用sed删除文件中的\r字符:sed -i 's/\r$//' setup
转换后再执行source setup,即可得到预期的拼接结果。
内容的提问来源于stack exchange,提问作者Nathan Goedeke
相关产品推荐
相关产品推荐

