$( )與` `(反引號)的區別和使用
技術標籤:Linux相關
轉載於https://blog.csdn.net/baidu_37964071/article/details/80930704
在bash中,$( )與` `(反引號)都是用來作命令替換的。
命令替換與變數替換差不多,都是用來重組命令列的,先完成引號裡的命令列,然後將其結果替換出來,再重組成新的命令列。
eg:
$( )與``
在操作上,這兩者都是達到相應的效果,但是建議使用$( ),理由如下:
- ``很容易與”搞混亂,尤其對初學者來說。
- 在多層次的複合替換中,``必須要額外的轉義字元處理(反斜線),而$( )比較直觀。
- 最後,$( )的弊端是,並不是所有的類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 命令簡單當作命令字串執行,失去了巢狀作用,巢狀被命令替換取代。
-