天天看點

Shell中反引号(`)與$()用法的差別

今天有人提問:

這就引申出了另一個問題:反引号與$()有沒有差別?

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

比如我們有一個shell腳本名為test.sh有一下兩行

1

2

<code>echo</code>  <code>`</code><code>echo</code> <code>\$HOSTNAME`     </code><code>//</code><code>反引号</code>

<code>echo</code> <code>$(</code><code>echo</code> <code>\$HOSTNAME)    </code><code>//</code><code>$()</code>

  我們可以使用sh -x test.sh來分析bash是如何來解釋這個腳本的,傳回的資訊如下:

Shell中反引号(`)與$()用法的差別

  通過上圖我們可以得出兩個結論:

反引号中\$并沒有将$的特殊意義轉換 反引号包含的内容 echo \$hostname 仍然被解釋為一個echo $HOSTNAME 取到了這個變量的值并輸出是以反引号傳回的值為 CentOS-1

$()則正好相反,$明顯被\轉義成了一個普通字元,是以并沒有取到變量值,而是傳回了字元串本身的意思,故而傳回了$HOSTNAME

  這說明反引号對反斜杠(\)有特殊的轉化,至少我們看到當我們直接用1個\時,它本身并不會起到轉義的作用。現在我們将腳本的内容做一些修改:

<code>echo</code>  <code>`</code><code>echo</code> <code>\\$HOSTNAME`     </code><code>//</code><code>反引号</code>

<code>echo</code> <code>$(</code><code>echo</code> <code>\\$</code><code>hostname</code><code>)    </code><code>//</code><code>$()</code>

  我們又多加了1個反斜杠,這次我們來看輸出的情況:

Shell中反引号(`)與$()用法的差別

  這次看起來似乎反轉了:

反引号反而輸出了$HOSTNAME的字面意思

$()如我們所願的取到了變量值,并理所應當的輸出了一個被轉義的字元串\

  我們再來做一個實驗,再建立一個腳本名為a.sh:

<code>echo</code>    <code>`</code><code>echo</code> <code>\\\\ `    </code>

<code>echo</code>  <code>$(</code><code>echo</code> <code>\\\\ )</code>

  注意:最後一個反引号和)的前面都有一個空格,否則最後一個反引号和)都将被注釋,不會被當做結束的替換符号。

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

Shell中反引号(`)與$()用法的差別

  通過上圖我們可以看到:

反引号中4個\被輸出為1個\

$()中4個\被輸出為2個\

  我們将腳本修改為8個\:

<code>echo</code>   <code>`</code><code>echo</code> <code>\\\\\\\\ `    </code>

<code>echo</code>  <code>$(</code><code>echo</code> <code>\\\\\\\\ )</code>

  再看輸出:

Shell中反引号(`)與$()用法的差別

  由此,我們可以得出結論:

反引号齊本身就對\進行了轉義,保留了齊本身意思,如果我們想在反引号中起到\的特殊意義,我們必須使用2個\來進行表示。

是以我們可以簡單的想象成反引号中: \\ = \

$()中則不需要考慮\的問題,與我們平常使用的一樣:\ = \

題外話: 反引号是老的用法,$()是新的用法,不管是在學習測試中,還是在實際工作中,$()的用法都是被推薦的。