Shell腳本之反引號【``】和 $()


一、奇怪的返回

今天在搞監控的時候,修改一個老腳本,主要是通過對操作系統進行判斷來獲取不同的監控參數。(獲取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、在不同環境測試,發現結果正確了!

看來問題就出在反引號上!

三、解決

既然知道了是反引號的問題,解決辦法就有了。我們先測試一下:

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

發現使用反引號時,需要將轉義符再次進行轉義!!

四、總結

從上面整個過程我們可以看出:

  1. 在shell腳本中使用反引號時,他本身就對\做了一層轉義,如果你有需要匹配的\的情況的話,需要再次進行轉義。所以在反引號中,兩個轉義符才是進行轉義!

  2. $()中則不需要考慮\的問題,與我們平常使用的一樣:\ = \。且自己轉義后,他還是識別轉義符。

  3. 反引號是老的用法,$()是新的用法,我們推薦使用$()。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM