Ansible 2.9.21:shell 命令中添加了不需要的转义字符“\”

Ansible 2.9.21:shell 命令中添加了不需要的转义字符“\”

在我的剧本中,以下行应该返回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 }}$'

相关内容