命令代換:在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命令可以給變量一個值。