
在我的劇本中,以下行應該返回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 }}$'