一、奇怪的返回
今天在搞監控的時候,修改一個老腳本,主要是通過對操作系統進行判斷來獲取不同的監控參數。(獲取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) #修改成$()方式 if [ $os_version -eq 1 ];then echo $os_version else echo 'aaa' fi
2、在不同環境測試,發現結果正確了!
看來問題就出在反引號上!
三、解決
既然知道了是反引號的問題,解決辦法就有了。我們先測試一下:

已經毫無疑問了,正是反引號的問題。那么反引號和$()有什么區別呢?

發現使用反引號時,需要將轉義符再次進行轉義!!
四、總結
從上面整個過程我們可以看出:
-
在shell腳本中使用反引號時,他本身就對\做了一層轉義,如果你有需要匹配的\的情況的話,需要再次進行轉義。所以在反引號中,兩個轉義符才是進行轉義!
-
$()中則不需要考慮\的問題,與我們平常使用的一樣:\ = \。且自己轉義后,他還是識別轉義符。
- 反引號是老的用法,$()是新的用法,我們推薦使用$()。
