1. 程式人生 > >【shell指令碼】命令代換 ` `, $( ) ,整數運算$(( )),變數代換${ },eval命令

【shell指令碼】命令代換 ` `, $( ) ,整數運算$(( )),變數代換${ },eval命令

一、命令代換

命令代換的意識是:先完成引號裡/括號裡的命令列,然後將其結果替換出來,再重組成新的命令列。shell腳本里,可用於命令代換的有反引號(` `),和$()。但是,我們知道Linux下不會存在冗餘的命令,既然存在兩個可以實現相同作用的符號,那麼它們一定有不同之處。

使用反引號的缺點如下:
1.它比較陳舊。
2.非常容易和單引號混淆。
3.它會對\進行跳脫處理。而$()不會。
這裡寫圖片描述

我們知道,shell裡的單引號會保持所有字元的字面值,所以引號裡的執行結果應該是 \ 。但是用反引號輸出的結果卻是 \ ,這就是由於它對 \ 進行了跳脫處理。

所以,一般情況下建議使用$(),這樣比較直觀,但是它也有它的缺點,並不是所有的類unix系統都支援這種方式,但反引號是肯定支援的。也就是說移植性不如反引號。

二、變數代換

一般情況下,使用 ${val}與$val效果是一樣的,但是前者能明確變數名的範圍,不至於產生混淆。
這裡寫圖片描述

三、整數運算

這裡寫圖片描述

可以看出,我們想要執行運算得到運算結果,就必須使用 $(()),否則不會產生生結果,同時,參與運算的引數可以省略前面的$符號。

四、eval命令

功能說明:告知shell取出eval的引數,重新運算求出引數的內容。
語  法:eval [引數]
補充說明:eval可讀取一連串的引數,然後再依引數本身的特性來執行。
參  數:引數不限數目,彼此之間用分號分開。
eval執行命令列前掃描兩次,再次運算求出引數內容,eval是對Bash Shell命令列處理規則的靈活應用,進而構造”智慧”命令實現複雜的功能。
這裡寫圖片描述


由於單引號會保持其內容字面值,所以直接echo打出來的就是字串${a},但是加了命令eval後,a的值就被打出來了,原因就是上面說的,它會掃描兩次,求出引數的內容。