反引號與$()的區別:shell
咱們先來看一個例子:bash
建立一個名爲test.sh的文件,在文件中輸入以下兩條指令dom
運行結果以下:ide
爲何這兩條語句運行結果不同呢?學習
這是一個很是有意思的問題,但要解釋這個問題確比較困難,我來換一個簡單一點的例子,通俗的解釋一下。測試
好比咱們有一個shell腳本名爲test1.sh有以兩行spa
咱們可使用sh -x test1.sh來分析bash是如何來解釋這個腳本的,返回的信息以下:blog
經過上圖咱們能夠得出兩個結論:字符串
1. 反引號中\$並無將$的特殊意義轉換 反引號包含的內容 echo \$hostname 仍然被解釋爲一個echo $HOSTNAME 取到了這個變量的值並輸出因此反引號返回的值爲 localdomain
get
$()則正好相反,$明顯被\轉義成了一個普通字符,因此並無取到變量值,而是返回了字符串自己的意思,故而返回了$HOSTNAME
2. 這說明反引號對反斜槓(\)有特殊的轉化,至少咱們看到當咱們直接用1個\時,它自己並不會起到轉義的做用。如今咱們將腳本的內容作一些修改:
咱們又多加了1個反斜槓,此次咱們來看輸出的狀況:
此次看起來彷佛反轉了:
1. 反引號反而輸出了$HOSTNAME的字面意思
2.$()如咱們所願的取到了變量值,並理所應當的輸出了一個被轉義的字符串\
咱們再來作一個實驗,再創建一個腳本名爲a.sh:
注意:最後一個反引號和)的前面都有一個空格,不然最後一個反引號和)都將被註釋,不會被當作結束的替換符號。
使用sh -x a.sh的結果以下:
經過上圖咱們能夠看到:
1 .反引號中4個\被輸出爲1個\
2. $()中4個\被輸出爲2個\
咱們將腳本修改成8個\:
再看輸出:
由此,咱們能夠得出結論:
1. 反引號齊自己就對\進行了轉義,保留了齊自己意思,若是咱們想在反引號中起到\的特殊意義,咱們必須使用2個\來進行表示。
2. 因此咱們能夠簡單的想象成反引號中: \\ = \
3. $()中則不須要考慮\的問題,與咱們日常使用的同樣:\ = \
注意: 反引號是老的用法,$()是新的用法,無論是在學習測試中,仍是在實際工做中,$()的用法都是被推薦的。