索引.sh 文件:
#!/bin/sh
source "global.sh"
echo "${CODE_DIR}/SOMETHING"
全局.sh 文件:
#!/bin/sh
APP_DIR="/app001/Documents/files/"
CODE_DIR="${APP_DIR}/code"
当我运行index.sh时:
预期输出:/app001/Documents/files/code/SOMETHING
输出:/SOMETHINGcuments/files//code
为什么?以及如何解决这个问题?
答案1
发生这种情况是因为您的global.sh
文件格式为 DOS,它将行尾编码为回车符后跟换行符。
Linux/Unix只会将换行符视为换行符,因此回车符将成为变量内容的一部分${CODE_DIR}
。
当您回显回车符时,光标将返回到行的开头。这就是本例中发生的情况,首先从 打印/app001/Documents/files//code
,${CODE_DIR}
然后该变量末尾的回车符会将光标移回到行的开头,然后该/SOMETHING
部分将覆盖字符串的开头。
您可以想象,通过管道输出cat -v
将显示所有字符,它将显示回车符为^M
:
$ ./index.sh | cat -v
/app001/Documents/files//code^M/SOMETHING
为了修复它,请将换行符转换global.sh
为 Unix 格式,您可以使用该dos2unix
工具(如果您的计算机上可用)来执行此操作。
$ dos2unix global.sh
或者在 Vim 中打开文件并在那里进行转换:
$ vim global.sh
:set ff=dos
:wq
您可能需要检查其他文件(例如index.sh
)的 DOS 行结尾。您可能还想检查为什么global.sh
会出现 DOS 文件结尾并修复它。如果您使用文本编辑器创建这些文件,请检查文本编辑器是否已正确配置为始终使用 Unix 行结尾。