![Ansible 2.9.21:shell 命令中添加了不需要的转义字符“\”](https://linux22.com/image/769382/Ansible%202.9.21%EF%BC%9Ashell%20%E5%91%BD%E4%BB%A4%E4%B8%AD%E6%B7%BB%E5%8A%A0%E4%BA%86%E4%B8%8D%E9%9C%80%E8%A6%81%E7%9A%84%E8%BD%AC%E4%B9%89%E5%AD%97%E7%AC%A6%E2%80%9C%5C%E2%80%9D.png)
在我的剧本中,以下行应该返回1
,如果返回>1
,则剧本应该停止:
shell: ls -l /opt/tomcat/|grep "[ ]\+{{ newTomcatVer }}$"; echo $?
我的游戏确实失败了,出现了这个错误:
"msg": "There is more than one /opt/tomcat/apache-tomcat-8.x.xx instance on server01, ending play"
在调试模式下再次运行后,我看到这个 shell 命令在调试输出中显示如下:
"cmd": "ls -l /opt/tomcat/|grep \"[ ]\\+apache-tomcat-8.5.69$\"; echo $?",
在上面,双引号用\
字符转义。问题是,实际使用的是哪个命令 - 剧本中的命令,还是我们在调试输出中看到的命令?
因为如果我运行笔记本中的命令,即没有转义字符,则输出将1
如预期的那样:
[tomcat@server01 ~]$ ls -l /opt/tomcat/|grep "[ ]\\+apache-tomcat-8.5.69$"; echo $?
1
但是如果我发出调试输出中的命令,我会得到以下结果:
[tomcat@server01 ~]$ ls -l /opt/tomcat/|grep \"[ ]\\+apache-tomcat-8.5.69$\"; echo $?
grep: Invalid regular expression
2
有什么想法可以解决这个问题吗?
答案1
使用单身的命令中的引号grep
。
grep "[ ]\+{{ newTomcatVer }}$"
当您使用双引号时,shell 将尝试进行变量扩展,这意味着它将尝试理解$"
。 这是$\"
因为 shell 无法将其识别$"
为可以扩展的参数,因此它会尝试猜测您想要的内容并转义引号。
这里没有真正理由进行 shell 参数扩展,因此您可以将正则表达式放在单引号中以解决问题。shell 不会尝试进行参数扩展,而是按$
字面意思处理。
grep '[ ]\+{{ newTomcatVer }}$'