在ssh 中执行sed -i 来替换匹配的字符串,当替换的内容中包含双引号"
时,需要在转义的同时,加上单引号'\"'
示例如下
<?xml version="1.0" encoding="UTF-8"?>
<channel name="test" update="false">
<server name="01服" ip="111.111.111.111" port="1111" state="111" device="0"/>
</channel>
需求: 修改上述xml中 state="111"
这个字段的第一位。
其中1表示服务器在运行,2表示服务器停服了。
然后有如下shell脚本,其中就遇到了一个sed命令替换的字符串中含有双引号的问题。错误信息如下。
bash: -c: line 0: unexpected EOF while looking for matching `"'
bash: -c: line 1: syntax error: unexpected end of file
上述问题一般是shell脚本漏掉了双引号"
,造成脚本中的双引号不匹配。举例如下
#!/bin/bash
# trouble: script to demonstrate common errors
number=1
if [ $number = 1 ]; then
echo "Number is equal to 1.
else
echo "Number is not equal to 1."
fi
但是我们出现的问题,提示信息跟他一样,但是我仔细检查过,并没有发现任何漏掉字符串的问题。
后来发现有一处引用了一个单个字符串(倒数第四行)
target="state=\"$targetState" # 之前未加单引号,所以会出错。
正确的代码如下:
#!/bin/bash
function run()
{
idipServer=192.168.10.142
fileName=/home/tomcat/rxjh/apache-tomcat-7.0.68/appcfg/cfg/520050/test.xml
targetIp=${1}
targetState=${2}
target="state='\"'$targetState" # 替换的单词中含有双引号,那么用单引号括起来
ssh -n tomcat@$idipServer "sed -i 's/\(ip=\"'$targetIp'.*\)\(state=\"...\)/\1'$target'/g' $fileName"
}
run $1 $2