Ansible
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
任何想法如何解決這個問題?
在命令中使用單引號。
grep
grep "[ ]\+{{ newTomcatVer }}$"
當您使用雙引號時,shell 將嘗試進行變數擴展,這意味著它將嘗試理解
$"
. 這是$\"
因為 shell 無法將其辨識$"
為可以擴展的參數,因此它會嘗試猜測您想要什麼並轉義引號。這裡沒有真正的理由做 shell 參數擴展,所以你可以將正則表達式放在單引號中來解決問題。shell 不會嘗試進行參數擴展,而是按
$
字面意思處理。grep '[ ]\+{{ newTomcatVer }}$'