shell腳本中反引號與$()的區別


反引號與$()的區別:shell

咱們先來看一個例子:bash

建立一個名爲test.sh的文件,在文件中輸入以下兩條指令dom

 wKioL1ditWDAq5FZAAAJ9atF8Qc539.png-wh_50

運行結果以下:ide

 wKiom1ditFqQf72EAAAMMSzbC7o195.png-wh_50

爲何這兩條語句運行結果不同呢?學習

這是一個很是有意思的問題,但要解釋這個問題確比較困難,我來換一個簡單一點的例子,通俗的解釋一下。測試

好比咱們有一個shell腳本名爲test1.sh有以兩行spa

 

 wKiom1ditG_yzqAvAAALnqJppRU204.png-wh_50

 

  咱們可使用sh -x test1.sh來分析bash是如何來解釋這個腳本的,返回的信息以下:blog

 wKioL1ditaDyUJqQAAAW1KMq5vg285.png-wh_50

 

  經過上圖咱們能夠得出兩個結論:字符串

1. 反引號中\$並無將$的特殊意義轉換 反引號包含的內容 echo \$hostname 仍然被解釋爲一個echo $HOSTNAME 取到了這個變量的值並輸出因此反引號返回的值爲 localdomain
get

$()則正好相反,$明顯被\轉義成了一個普通字符,因此並無取到變量值,而是返回了字符串自己的意思,故而返回了$HOSTNAME

2. 這說明反引號對反斜槓(\)有特殊的轉化,至少咱們看到當咱們直接用1個\時,它自己並不會起到轉義的做用。如今咱們將腳本的內容作一些修改:

 wKiom1ditJqDv6tYAAALWaveLlA588.png-wh_50

 

  咱們又多加了1個反斜槓,此次咱們來看輸出的狀況:

 wKioL1ditdDBxPldAAAnkLM7jqM457.png-wh_50

 

  此次看起來彷佛反轉了:

1. 反引號反而輸出了$HOSTNAME的字面意思

2.$()如咱們所願的取到了變量值,並理所應當的輸出了一個被轉義的字符串\

咱們再來作一個實驗,再創建一個腳本名爲a.sh:

 wKiom1ditNTDS7U4AAAIG_97TGk595.png-wh_50

 

 

  注意:最後一個反引號和)的前面都有一個空格,不然最後一個反引號和)都將被註釋,不會被當作結束的替換符號。

  使用sh -x a.sh的結果以下:

 

 wKioL1ditg_Th5MBAAAYBkNQGxM929.png-wh_50

 

經過上圖咱們能夠看到:

1 .反引號中4個\被輸出爲1個\

2. $()中4個\被輸出爲2個\

咱們將腳本修改成8個\:

 

 wKioL1ditiqhiQgTAAAKagCrwLw120.png-wh_50

  再看輸出:

 wKiom1ditSXCsVgCAAAeaCmLzkc875.png-wh_50

 

  由此,咱們能夠得出結論:

1. 反引號齊自己就對\進行了轉義,保留了齊自己意思,若是咱們想在反引號中起到\的特殊意義,咱們必須使用2個\來進行表示。

2. 因此咱們能夠簡單的想象成反引號中: \\ = \

3. $()中則不須要考慮\的問題,與咱們日常使用的同樣:\ = \

注意: 反引號是老的用法,$()是新的用法,無論是在學習測試中,仍是在實際工做中,$()的用法都是被推薦的。

相關文章
相關標籤/搜索