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 }}$'

相關內容