我正在尝试连接用户输入中的两个字符串。这些是该文本的“查找内容”和“替换内容”。它最终将成为构建过程的一部分。我似乎无法正确连接变量。这是脚本:
#!/bin/bash
first=${1}
second=${2}
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"
Run Code Online (Sandbox Code Playgroud)
我将 echo 与first和second变量一起放在那里进行故障排除。我得到的结果是这样的:
mrhoden@mrhoden-dt ~
$ bash C:\\Users\\mrhoden\\workspace\\Test\\Concatenation.sh Yes No
Hello Kitties=Yes
/gello Kitties=Noes
Run Code Online (Sandbox Code Playgroud)
我不明白为什么第一个工作正常,但第二个却不行。我什至考虑过,/但是当我用 a 或任何其他字符替换它时,l我得到的结果基本上相同。我尝试了各种对变量进行分组和转义的方法。我什至下载并使用了 Eclipse 和 ShellEd 插件,以防 Windows 和基于 UNIX 的编辑器(以前是 Notepad++)之间出现一些奇怪的交互。
我很茫然,任何帮助将不胜感激。
看起来你的脚本文件是 DOS/Windows 格式(每行末尾有一个回车符和换行符)而不是 unix 格式(每行末尾只有换行符)。当 shell 执行它时,它将回车符(有时写为\r)视为命令的一部分。例如:first=${1}\r设置$first为第一个参数,并附加回车符。然后TO_REPLACE="Hello Kitties=$first"\r设置$TO_REPLACE为该值,并在末尾添加另一个回车符。所以当你看到第二个回声时,它实际上在做的是:
echo "s/Hello Kitties=Yes\r\r/Hello Kitties=No\r\r/g"\r
Run Code Online (Sandbox Code Playgroud)
当打印时,每个回车符都会使终端返回到行的开头,因此它本质上打印三件事,每件事都在最后一个之上:
s/Hello Kitties=Yes
/Hello Kitties=No
/g
Run Code Online (Sandbox Code Playgroud)
给你留下混乱的局面:
/gello Kitties=Noes
Run Code Online (Sandbox Code Playgroud)
解决方案:按照@shellter的建议,使用dos2unix将脚本转换为unix格式,然后坚持使用unix风格的脚本文本编辑器。