今天在搞監控的時候,修改乙個老指令碼,主要是通過對作業系統進行判斷來獲取不同的監控引數。(獲取top引數在不同作業系統上也有個坑,會在另外一篇裡面寫)
指令碼如下,非常簡單:
#處理centos7採集磁碟使用率問題本來邏輯和語法都非常簡單,沒想到結果卻出人意料。os_version=`cat /etc/issue|grep -w "\\\s"|wc -l`
if [ $os_version -eq 1 ];then
echo $os_version
else
echo 'aaa'
fi
我只是希望通過issue判斷系統是否為centos7,如果是,則輸入\s;如果不是,則輸出『aaa』.
但是發現不管是在centos7還是centos6上,結果都是輸出aaa。
centos7上:
centos6上:
那到底是什麼原因呢?
經過-x輸出檢視,發現結果都是出乎意料的2。因為結果是全部匹配,所以沉思許久還是不得其解。而且我也考慮到了特殊符號的轉義問題,那又是還有其他什麼問題呢?
因為在shell中執行命令並賦值給變數有兩種方式,另外一種方式是用$(),例如a=$(cat /etc/issue).那就用第二種方式測試一下吧。
1、將指令碼修改:
os_version=$(cat /etc/issue|grep -w "\\\s"|wc -l) #修改成$()方式2、在不同環境測試,發現結果正確了!if [ $os_version -eq 1 ];then
echo $os_version
else
echo 'aaa'
fi
看來問題就出在反引號上!
既然知道了是反引號的問題,解決辦法就有了。我們先測試一下:
已經毫無疑問了,正是反引號的問題。那麼反引號和$()有什麼區別呢?
發現使用反引號時,需要將轉義符再次進行轉義!!
從上面整個過程我們可以看出:
$()中則不需要考慮\的問題,與我們平常使用的一樣:\ = \。且自己轉義後,他還是識別轉義符。
反引號是老的用法,$()是新的用法,我們推薦使用$()。
shell指令碼中的反引號,單引號,雙引號與反斜槓
反引號位 經常被忽略,而且容易與單引號弄混。它位於鍵盤的tab鍵的上方 1鍵的左方。單引號 位於enter鍵的左方。在linux中反引號起著命令替換的作用。命令替換是指shell能夠將乙個命令的標準輸出插在乙個命令列中任何位置,將反引號中的字串做為命令來執行,我們在用shell程式設計時經常用的到,...
Shell單引號,雙引號,反引號,反斜槓
shell單引號,雙引號,反引號,反斜槓 shell可以識別4種不同型別的引字符號 單引號字元 雙引號字元 反斜槓字元 反引號字元 1.單引號 grep susan phonebook susan goldberg 403 212 4921 susan topple 212 234 2343 如果我...
shell 指令碼中雙引號 單引號 反引號 的區別
在shell中引號分為三種 單引號,雙引號和反引號。單引號 由單引號括起來的字元都作為普通字元出現。特殊字元用單引號括起來以後,也會失去原有意義,而只作為普通字元解釋。例如 string path echo string path 可見 保持了其本身的含義,作為普通字元出現。雙引號 由雙引號括起來的...