1. 程式人生 > >Shell中反引號(`)與$()用法的區別

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. $()中則不需要考慮\的問題,與我們平常使用的一樣:\ = \

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

相關推薦

Shell引號`$()用法區別

今天有人提問: echo `echo \\\\\\\w` echo $(echo \\\\\\\w) 為什麼輸出的不一樣? 這就引申出了另一個問題:反引號與$()有沒有區別? 這是一個非常有意思的問題,但要解釋這個問題確比較困難,我來換一個簡單一點的例子,通俗的解

shell引號轉義

在echo 中 反引號用單斜槓槓轉義 例如 tColmn=$(hive -e “desc s o u

MySQL函式field用法

MySQL中的field()函式,可以用來對SQL中查詢結果集進行指定順序排序。 str與str1,str2,str3,str4比較,其中str指的是欄位名字 意為:欄位str按照字串str1,str2,str3,str4的順序返回查詢到的結果集。如果表中str欄位值不存在於str

JavaScript的split用法和例子。

function splitArray(str,separator) {//separator是以何種形式對字串進行切割 var str2 = str.split(separator); console.log("字串本身樣子:"+str); con

Linux shell 引號 $() 的對比

這兩者都是命令替換,命令替換是指:是Shell 執行命令並將命令替換部分替換為執行該命令後的結果。 比如: [bob@centos home]$ val=hello [bob@centos home]$ echo $(echo $val) hello [

C++的Compare函式用法

#include <iostream> #include <string> #include <cctype> using std::cout; using std::endl; using std::cin; using s

shell引號、單引號、雙引號的使用

總結一些簡單的shell小知識,在一位網友的部落格基礎上做了一些修改,感謝一些網友的分享。 一、shell中的反引號(` `)的作用 將反引號(` `)內的字串當作shell命令來執行,返回值是命令的執行的結果,起到的是一個命令的替換作用。 舉例: 輸出日期 二、she

shell引號和$()的區別以及eval命令

反引號和$()的區別 反引號和$()都是shell指令碼中用來進行命令代換的命令,命令代換就是執行一個命令將其結果交給一個變數。 echo ‘echo \\ ’ //反引號

Shell引號和$()的區別

Shell中可以用來實現變數代換的命令有兩種,一種是由反引號括起來的一條命令另一種是由$()括起來一條命令,shell先執行這條命令,然後見輸出結果立刻代換到當前命令列中。   例如定義一個變數存放date命令的輸出:     $DATE=`data`     $echo

執行緒sleep方法和Object類的wait方法的區別

這兩者的施加者是有本質區別的. sleep()是讓某個執行緒暫停執行一段時間,其控制範圍是由當前執行緒決定,也就是說,線上程裡面決定.好比如說,我要做的事情是 "點火->燒水->煮麵",而當我點完火之後我不立即燒水,我要休息一段時間再燒.對於執行的主動權是由我

shell引號(`)$()的作用區別

linux下的反引號(`)和$()執行的是命令替換的功能。 1、將命令的執行結果賦給一個變數 反引號: DATE=`date` //變數=`命令` echo $DATE 執行結果為: [[email protected] Signal_shell]

Linux Shell-awk輸出單引號'

1 場景 在shell指令碼中,單引號‘'’是一個特殊字元,特別是當使用awk命令輸出單引號,即使使用/\'/轉義都無法輸出。 2 分析 嘗試使用單引號的八進位制編碼來替代它進行輸出: awk -F ':'  '{print "test.sh \047"$1"\047;

linux下如何在shell結束程序ctrl+c\ctrl+z\ctrl+d\ctrl+\的用法

ctrl-c:傳送 SIGINT 訊號給前臺程序組中的所有程序。常用於終止正在執行的程式; ctrl-z:傳送 SIGTSTP訊號給前臺程序組中的所有程序,常用於掛起一個程序; ctrl-d:不是傳送

shell引號、雙引號斜杠簡說

能夠 col 都是 嵌套 修改文件 字符 變量名 令行 文件中 需求:ssh遠程修改文件,變量從文件中獲取,插入遠程服務器的文件裏 shell腳本中的單引號和雙引號一樣都是字符串的界定符,而不是字符的界定符。單引號用於保持引號內所有字符的字面值,即使引號內的\和回車也不

pythonenumerate用法

bsp pos 元素 變量 lis 遍歷序列 rate too st3 先出一個題目:1.有一 list= [1, 2, 3, 4, 5, 6] 請打印輸出:0, 1 1, 2 2, 3 3, 4 4, 5 5, 6 打印輸出, 2.將 list 倒序成 [6, 5, 4

10 字典enumerate用法

pytho rain lex cal 字典 rest num strip appdata li = {"alex"," aric","Alex","Tony","rain"}for i,j in enumerate(li,1): new_j = j.strip()

c++冒號:和雙冒號::用法【轉】

(轉自:https://blog.csdn.net/zimingjushi/article/details/6549390?utm_source=blogxgwz1)   1.冒號(:)用法 (1)表示機構內位域的定義(即該變數佔幾個bit空間) typedef struct _X

python星號*用法

這裡不說乘法,大家都知道 先看幾個測試語句: import numpy as np a=np.random.rand(2) print(a) print(*a) 輸出結果: [0.95721482 0.55708755] 0.9572148191916312 0.5570875

C++引用&用法和應用例項

對於習慣使用C進行開發的朋友們,在看到c++中出現的&符號,可能會犯迷糊,因為在C語言中這個符號表示了取地址符,但是在C++中它卻有著不同的用途,掌握C++的&符號,是提高程式碼執行效率和增強程式碼質量的一個很好的辦法。在 c++學習提高篇(3)---隱式

c++冒號:和雙冒號::用法

轉載於:http://fengqing888.blog.163.com/blog/static/3301141620100623933512/ 1.冒號(:)用法 (1)表示機構內位域的定義(即該變數佔幾個bit空間) typedef struct _XXX{ unsign