Bash 脚本不连接字符串

Bash Script Not Concatenating Strings

我正在尝试连接来自用户输入的两个字符串。这些是文本的 "what to look for" 和 "what to replace"。它最终将成为构建过程的一部分。我似乎无法让变量正确连接。这是脚本:

#!/bin/bash
first=
second=
TO_REPLACE="Hello Kitties=$first"
REPLACEMENT="Hello Kitties=$second"
echo $TO_REPLACE
echo "s/${TO_REPLACE}/${REPLACEMENT}/g"
sed -i "s/${TO_REPLACE}/${REPLACEMENT}/g" "C:\Test\Mah.config"

我将回声放在那里以与 firstsecond 变量一起进行故障排除。我得到的结果是这样的:

mrhoden@mrhoden-dt ~
$ bash C:\Users\mrhoden\workspace\Test\Concatenation.sh Yes No
Hello Kitties=Yes
/gello Kitties=Noes

我不明白为什么第一个可以正常工作,而第二个却不行。我什至考虑过 / 但是当我用 l 或任何其他字符替换它时,我得到的结果基本相同。我尝试了各种对变量进行分组和转义的方法。我什至下载了 eclipse 并将其与 ShellEd 插件一起使用,以防 windows 和基于 unix 的编辑器(以前是 Notepad++)之间出现一些奇怪的交互。

我很茫然,如有任何帮助,我们将不胜感激。

看起来你的脚本文件是 DOS/Windows 格式(每行末尾有回车符 return 后跟换行符)而不是 unix 格式(每行末尾只有换行符)线)。当 shell 执行它时,它会将回车 return(有时写作 \r)视为命令的一部分。例如:first=\r$first 设置为第一个参数,并附加一个回车符 return。然后 TO_REPLACE="Hello Kitties=$first"\r$TO_REPLACE 设置为那个,最后加上 另一个 马车 return。所以当你看到第二个回声时,它实际上在做的是:

echo "s/Hello Kitties=Yes\r\r/Hello Kitties=No\r\r/g"\r

打印时,每个回车符 return 都会使终端返回到行首,因此它实质上会打印三件东西,每件都在最后一件之上:

s/Hello Kitties=Yes
/Hello Kitties=No
/g

留给你的是一团糟:

/gello Kitties=Noes

解决方案:按照@shellter的建议,使用dos2unix将脚本转换为unix格式,然后坚持使用unix风格的脚本文本编辑器。