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可以掃描複雜變量,並執行變量中的命令,反引號也可以執行復雜變量,但打印結果時,不會換行,$( ) 不能處理複雜變量:
結果如圖: