Bash脚本不连接字符串

时间:2015-01-15 15:22:45

标签: bash shell sed

我试图从用户输入连接两个字符串。这些是“寻找什么”和“替换”文本的内容。它最终将成为构建过程的一部分。我似乎无法让变量正确连接。这是脚本:

#!/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"

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

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

我不明白为什么第一个工作正常,但不是第二个。我甚至考虑了/但是当我用l或任何其他角色替换它时,我得到的结果基本相同。我已经尝试了各种方法来对变量进行分组和转义。我甚至下载并使用了带有ShellEd插件的eclipse,以防wind​​ows和基于unix的编辑器之间有一些奇怪的交互(以前的Notepad ++)。

我很茫然,任何帮助都会受到赞赏。

1 个答案:

答案 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样式的文本编辑器来处理脚本。