从源继承变量覆盖我当前的变量

从源继承变量覆盖我当前的变量

索引.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 行结尾。

相关内容