Shell中反引號(`)與$()用法的區別

今天有人提問:

	echo `echo \\\\\\\w`
	echo $(echo \\\\\\\w)
	爲什麼輸出的不一樣?

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

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

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

1
2
echo  `echo \$HOSTNAME`     //反引號
echo $(echo \$HOSTNAME)    //$()

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


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

  1. 反引號中\$並沒有將$的特殊意義轉換 反引號包含的內容 echo \$hostname 仍然被解釋爲一個echo $HOSTNAME 取到了這個變量的值並輸出所以反引號返回的值爲 CentOS-1

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

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

1
2
echo  `echo \\$HOSTNAME`     //反引號
echo $(echo \\$hostname)    //$()

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


  這次看起來似乎反轉了:

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

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

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

1
2
echo    `echo \\\\ `    
echo  $(echo \\\\ )

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

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


  通過上圖我們可以看到:

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

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

  我們將腳本修改爲8個\:

1
2
echo   `echo \\\\\\\\ `    
echo  $(echo \\\\\\\\ )

  再看輸出:


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

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

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

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章