shell命令代換與eval命令

命令代換:在shell中用以下兩種方式實現命令代換:

`COMMAND`   //反引號
$(COMMAND)   //$()

命令代換即首先執行反引號或括號裏的命令,將其結果立刻代換到當前命令行中或者代換賦予一個變量:
如下圖,在一個shell腳本中打印日期:
這裏寫圖片描述

以上執行過程中:第一種先執行反引號與()中date命令,執行完成,結果代換到命令行中然後用echo命令輸出;第二種先執行了$()中的data命令,然後將此命令執行結果代換到當前命令行,賦予一個變量,將此變量echo輸出。
執行結果如下:
這裏寫圖片描述

從以上可知,兩種方式的命令代換都可以實現相同效果,那區別在於那些方面:
1.最主要的區別如下:
這裏寫圖片描述
即可以看出用$()最後輸出的“\”是按照普通字符輸出的,使用反引號則是將“\”轉義爲”\”在執行,所以此處輸出一個‘\’.
2.並且反引號是舊用法,()是新用法,反引號基本適用於全部unix shell中,()則相反;
3.命令代換是允許嵌套的,在多層次的複合替換中,反引號是比較複雜的如下:

echo `echo \`echo 'hello world'\``

$()如下:

echo $(echo $(echo 'hello world'))

所以$()是比較直觀的,一般都推薦使用.

eval命令首先掃描命令行進行所有的替換,然後在執行該命令,如:
這裏寫圖片描述
如以上圖:先創建一個文件test內容有上圖顯示,然後將”cat test”作爲一個字符串賦予變量mytest,直接echo這個變量則其只會打印“cat test”,但是當用eval命令時其則會打印出test文件內容:即其先將變量mytest替換爲cat test,最後執行此命令。
所以1.該命令適用於執行那些一次掃描無法實現其功能的變量,其對變量進行兩次掃描,而這些需被兩次掃描才能實現其功能的變量稱爲複雜變量。
2.eval命令依然可以回顯簡單變量,不一定只處理複雜變量。如:

NAME=test
eval echo $NAME  等價於   echo $NAME

3.eval命令可以顯示出傳遞給腳本的最後一個參數;
4.eval命令可以給變量一個值。

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