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

來源:互聯網
上載者:User

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

  1. echo `echo \$HOSTNAME` //反引號 echo $(echo \$HOSTNAME) //$()
今天有人提問:


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


這就引申出了另一個問題:反引號與$()有沒有區別?
這是一個非常有意思的問題,但要解釋這個問題確比較困難,我來換一個簡單一點的例子,通俗的解釋一下。
比如我們有一個shell指令碼名為test.sh有一下兩行
  我們可以使用sh -x test.sh來分析bash是如何來解釋這個指令碼的,返回的資訊如下:

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

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

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

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

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

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

  這次看起來似乎反轉了:

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

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

  我們再來做一個實驗,再建立一個指令碼名為a.sh:

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

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

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

  通過我們可以看到:

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

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

  我們將指令碼修改為8個\:

  echo `echo \\\\\\\\ ` echo $(echo \\\\\\\\ )

  再看輸出:

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

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

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

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

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.