Bash脚本未连接字符串
我试图从用户输入中连接两个字符串。这些是“寻找什么”和“替换什么”文本。它最终将成为构建过程的一部分。我似乎无法使变量正确连接。以下是脚本:Bash脚本未连接字符串,bash,shell,sed,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_RE
#!/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"
我将echo与first
和second
变量放在一起进行故障排除。我得到的结果是:
mrhoden@mrhoden-dt ~
$ bash C:\\Users\\mrhoden\\workspace\\Test\\Concatenation.sh Yes No
Hello Kitties=Yes
/gello Kitties=Noes
我不明白为什么第一个很好用,但第二个不行。我甚至考虑过/
,但当我用l
或任何其他字符替换它时,我得到的结果基本相同。我尝试了各种方法对变量进行分组和转义。我甚至下载并使用了eclipse和外壳插件,以防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
打印时,每个回车符都会使终端返回到行的开头,因此它基本上会打印三件东西,每件都在最后一件上面:
s/Hello Kitties=Yes
/Hello Kitties=No
/g
给你留下一堆乱七八糟的东西:
/gello Kitties=Noes
解决方案:正如@Shelleter所建议的,使用
dos2unix
将脚本转换为unix格式,然后继续使用unix样式的脚本文本编辑器。看起来您的脚本文件是DOS/Windows格式(每行末尾都有回车符和换行符)而不是unix格式(每行末尾只有换行符)。当shell执行它时,它将回车符(有时写入\r
)作为命令的一部分。例如:first=${1}\r
将$first
设置为第一个参数,并附加回车符。然后设置为\u REPLACE=“Hello Kitties=$first”\r
将$设置为_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
解决方案:正如@Shelleter所建议的,使用
dos2unix
将脚本转换为unix格式,然后继续使用unix样式的脚本文本编辑器。看起来您的脚本文件是DOS/Windows格式(每行末尾都有回车符和换行符)而不是unix格式(每行末尾只有换行符)。当shell执行它时,它将回车符(有时写入\r
)作为命令的一部分。例如:first=${1}\r
将$first
设置为第一个参数,并附加回车符。然后设置为\u REPLACE=“Hello Kitties=$first”\r
将$设置为_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
解决方案:正如@Shelleter所建议的,使用
dos2unix
将脚本转换为unix格式,然后继续使用unix样式的脚本文本编辑器。看起来您的脚本文件是DOS/Windows格式(每行末尾都有回车符和换行符)而不是unix格式(每行末尾只有换行符)。当shell执行它时,它将回车符(有时写入\r
)作为命令的一部分。例如:first=${1}\r
将$first
设置为第一个参数,并附加回车符。然后设置为\u REPLACE=“Hello Kitties=$first”\r
将$设置为_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
解决方案:正如@Shelleter所建议的,使用
dos2unix
将脚本转换为unix格式,然后坚持使用unix风格的文本编辑器来编辑脚本。看起来像是$'\r'
从MSWin行结束进入字符串。dos2unix文件
。祝你好运。看起来像是$'\r'
从MSWin行结束进入字符串。dos2unix文件
。祝你好运。似乎从MSWin行的$'\r'
结尾进入字符串。dos2unix文件
。祝你好运。似乎从MSWin行的$'\r'
结尾进入字符串。dos2unix文件
。祝你好运。感谢你的完整解释,它终于有意义了。如果有人来找这个,你必须找到它重新安装cygwin并在utils下查找dos2unix包。在看到这个答案之前,我完全被搞糊涂了。非常好的解释!感谢您再为我节省5个小时!感谢您的完整解释,它终于有意义了。如果有人来找这个,您必须重新安装cygwin并在utils下查找dos2unix包包装。在看到这个答案之前,我完全糊涂了。很好的解释!谢谢你再帮我省下5个