shell---反引號,$( )以及eval的比較

1.反引號“ 和$( )的相同點:

反引號是將“中的命令執行,再將執行結果替換到代碼所在地,交給外層顯示,即將命令的結果作爲輸入或輸出。

$( )和反引號都是用於命令的替換

編寫一個腳本,顯示出HOME目錄:
這裏寫圖片描述

執行結果,與預期相同:
這裏寫圖片描述

2.反引號“ 和$( )的區別:

對於很多命令,雖然反引號和$( )的的輸出結果相同,但是有一個字符卻可以區別它們,那就是轉義字符\

①先看它們對於一個轉義字符的處理:
這裏寫圖片描述

結果如圖:
這裏寫圖片描述

可以看到,與預期結果不同,反引號仍然顯示出HOME目錄,並沒有進行轉義,而$( )成功轉義。

②再加一個轉義字符時:
這裏寫圖片描述

結果如圖:
這裏寫圖片描述

此時,反引號成功轉義,打印出字符串,而$( )將第二個\進行轉義顯示,然後再顯示出HOME工作目錄。

③再觀察對於多個\,它們的處理情況:
這裏寫圖片描述

結果如圖:
這裏寫圖片描述

一共有8個\,倒反號執行後打印出2個,而$( )打印出4個

因此,可以得到結論:
①反引號對於轉義字符\,只有出現兩個以上轉義字符時,纔會起到轉義的作用,否則,它會執行命令本身,所以,對於反引號,可以將兩個\當做一般的一個\使用;
②$( )對於轉義字符\,和一般處理情況相同,只有一個\就可以進行轉義;

3.eval的使用

作用:eval命令適用於那些一次掃描無法實現其功能的變量,對於這些複雜變量,eval會進行兩次掃描。它會先掃描所有命令行進行命令替換,然後再執行該命令。

①eval雖然用於複雜變量,但也可以回顯簡單命令:
這裏寫圖片描述

這裏寫圖片描述

②eval可以兩次掃描變量,先進行命令替換,然後執行命令
這裏寫圖片描述

結果如圖,echo打印出字符串,而eval執行了命令:
這裏寫圖片描述

③eval可以用來獲取最後一個參數:
如設置參數111 222 333 444,要取得最後一個參數,一般會使用 $#,但我們可以看到使用後,並沒有出現預期結果,但是可以使用eval得到最後一個參數:
這裏寫圖片描述

4.反引號,$( )與eval的區別:

eval可以掃描複雜變量,並執行變量中的命令,反引號也可以執行復雜變量,但打印結果時,不會換行,$( ) 不能處理複雜變量:

這裏寫圖片描述

結果如圖:
這裏寫圖片描述

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