我试图从用户输入连接两个字符串。这些是“寻找什么”和“替换”文本的内容。它最终将成为构建过程的一部分。我似乎无法让变量正确连接。这是脚本:
#!/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"
我将回声放在那里,以便与first
和second
变量一起排除故障。我得到的结果是:
mrhoden@mrhoden-dt ~
$ bash C:\\Users\\mrhoden\\workspace\\Test\\Concatenation.sh Yes No
Hello Kitties=Yes
/gello Kitties=Noes
我不明白为什么第一个工作正常,但不是第二个。我甚至考虑了/
但是当我用l
或任何其他角色替换它时,我得到的结果基本相同。我已经尝试了各种方法来对变量进行分组和转义。我甚至下载并使用了带有ShellEd插件的eclipse,以防windows和基于unix的编辑器之间有一些奇怪的交互(以前的Notepad ++)。
我很茫然,任何帮助都会受到赞赏。
答案 0 :(得分:2)
看起来您的脚本文件是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
当打印时,每个回车使终端返回到行的开头,因此它基本上打印了三个东西,每个都在最后一个上面:
s/Hello Kitties=Yes
/Hello Kitties=No
/g
留下你的混合物:
/gello Kitties=Noes
解决方案:正如@shellter建议的那样,使用dos2unix
将脚本转换为unix格式,然后坚持使用unix样式的文本编辑器来处理脚本。