2

我在 bash 脚本中有一个 sed 命令,如下所示:

sed -i 's/db.url=.*/db.url='$URL'/' config.properties

并且 URL var 分配为:

$URL=jdbc\:oracle\:thin\:@\/\/hostname\:12345\/XYZ

当我在主机上运行此 bash 脚本时,它会按预期工作,将 URL 替换为 URL 中指定的 URL。但是,当我在 bash 脚本中添加命令以在我的其他主机上执行此操作时,如下所示:

ssh user@host02 <<EOF
 sed -i 's/db.url=.*/db.url='$URL'/' config.properties
exit
EOF

我收到此错误:

sed: -e expression #1, char 47: unknown option to `s'

有人知道这里可能发生了什么吗?

4

2 回答 2

2

如果表达式在本地主机上运行,​​则您已经正确地引用了该sed表达式,但是该字符串随后被传递到远程主机上的 shell,其中*现在不加引号并将其扩展为一个 glob。最简单的做法是通过标准输入将命令通过管道传送到远程 shell,因此您不必担心引用:

echo "sed -i 's/db.url=.*/db.url=$URL/' config.properties" | ssh user@host02 bash

使用多个命令,您可以考虑使用此处的文档:

ssh user@host02 bash <<EOF
command1
sed -i 's/db.url=.*/db.url=$URL/' config.properities
command2
EOF
于 2013-06-10T15:53:33.237 回答
1

解决方案是在 $URL 周围使用双单引号 ('),如下所示:''$URL''

于 2013-06-10T20:20:03.947 回答