1. 程式人生 > 其它 >$( )與` `(反引號)的區別和使用

$( )與` `(反引號)的區別和使用

技術標籤:Linux相關

轉載於https://blog.csdn.net/baidu_37964071/article/details/80930704

在bash中,$( )與` `(反引號)都是用來作命令替換的。
命令替換與變數替換差不多,都是用來重組命令列的,先完成引號裡的命令列,然後將其結果替換出來,再重組成新的命令列。

eg:
這裡寫圖片描述

$( )與``

在操作上,這兩者都是達到相應的效果,但是建議使用$( ),理由如下:

  1. ``很容易與”搞混亂,尤其對初學者來說。
  2. 在多層次的複合替換中,``必須要額外的轉義字元處理(反斜線),而$( )比較直觀。
  3. 最後,$( )的弊端是,並不是所有的類unix系統都支援這種方式,但反引號是肯定支援的。

eval命令

eval可以讀取一連串的引數,然後按照引數特性來執行。引數數目不限,彼此之間用分號隔開。
eval會對後面的命令進行兩遍掃描
如果第一遍掃描後,命令是個普通命令,則執行此命令;如果命令中含有變數的間接引用,則保證間接引用的語義。也就是說,eval命令將會首先掃描命令列進行所有的置換,然後再執行該命令。
因此,eval命令適用於那些一次掃描無法實現其功能的變數。

eval 執行以下兩個步驟:
第一步,執行變數替換,類似與C語言的巨集替代;
第二步,執行替換後的命令串。

下面來看幾個例子:
例:執行含有帶字串的命令

[root@localhost ~]# cat test
Hello World! [root@localhost ~]# WORD="cat test" [root@localhost ~]# echo $WORD cat test [root@localhost ~]# eval $WORD Hello World!

看上面的例子,把cat test賦值給變數WORD。當我們執行echo WORD就是將變數WORD的值列出來,並不能得到test中的內容;然而eval WORD則能顯示檔案中的內容,因為eval命令對後面的命令進行了兩次掃描,第一次將WORD替換為 cat test,第二次執行cat test。
這些需要進行兩次掃描的變數有時被稱為複雜變數。


eval命令不僅可以回顯複雜變數,也可以用於回顯簡單變數。
例:回顯簡單變數

[root@localhost ~]# NAME=filename
[root@localhost ~]# echo $NAME
filename
[root@localhost ~]# eval echo $NAME
filename

 
 

例:獲取傳給shell的最後一個引數
之前我們已經瞭解過shell語法,知道最後一個引數是$#,看如下程式碼,用eval可得到其內容。

[[email protected] ~]# cat test.sh
#!/bin/bash
echo "\$$#"
eval echo "\$$#"
[[email protected] ~]# chmod u+x test.sh
[[email protected] ~]# ./test.sh first last
$2
last

 
 
  • 例:條件篩選
    在file檔案中寫入兩列資料,第一列對應KEY 、第二列為VALUE,使用eval命令將KEY與VALUE的值對應起來,從檔案中讀取:

    [[email protected] ~]# cat file
    NAME ZHANG
    AGE 20
    SEX NV
    [[email protected] ~]# cat test.sh
    #!/bin/bash
    
    while read KEY VALUE
    do
        eval "${KEY}=${VALUE}"
    done < file
    echo "$NAME $AGE $SEX"
    [[email protected] ~]# ./test.sh
    ZHANG 20 NV
    
        
        
    • 注意:
      1、eval 不能獲得函式處理結果。
      2、shell中eval 巢狀無意義,在其他語言中可以通過 eval(eval(“code”)) ,來執行動態生成的 code 的返回,而由於shell 中 eval 將後面的 eval 命令簡單當作命令字串執行,失去了巢狀作用,巢狀被命令替換取代。