Linux 中shell指令碼 eval調研

2021-08-03 08:19:46 字數 1179 閱讀 3108

eval可以讀取一連串的引數,然後按照引數特性來執行。引數數目不限,彼此之間用分號隔開。 

eval會對後面的命令進行兩遍掃瞄,如果第一遍掃瞄後,命令是個普通命令,則執行此命令;如果命令中含有變數的間接引用,則保證間接引用的語義。也就是說,eval命令將會首先掃瞄命令列進行所有的置換,然後再執行該命令。因此,eval命令適用於那些一次掃瞄無法實現其功能的變數。 

eval 執行以下兩個步驟: 

第一步,執行變數替換,類似與c語言的巨集替代; 

第二步,執行替換後的命令串。 

eval是shell內建的命令。eval命令可以對命令列求值,然後做shell替換,再執行替換後的命令列。

1、eval會把賦值語句中雙引號之間的內容直接賦給『=』前的變數,而不是當作字串賦給變數。

例如:

version=」(2 4)」 是將字串賦值給 version;

eval version=」(2 4)」 執行時變成了 version=(2 4), 是把陣列 (2 4) 賦值給 version

2、當在乙個賦值語句的前面加上 eval 時,它就會將 後面表示式中以 $ 開頭的所有變數進行整體替換

例如:執行下面程式:

執行結果:

3、eval會把標準輸出中的內容進行賦值

例:

執行結果:

三者的的區別是什麼呢?

1.反引號「本身對\進行了轉義,並保留了其本身的意思,如果要在反引號中 起到\的意思,必須加兩個\。

2.$()中並沒有對\進行轉義,使用時只需要乙個\即可。

.shell 中的 eval

1 不能獲得函式處理結果 ,所有命令,函式的處理結果只能通過 ``來獲得,那麼其它語言中利用eval來獲得動態生成**執行後的輸出變得不可能。

2 eval 巢狀無意義 ,在其他語言中可以通過 eval(eval("code")),來執行(執行動態生成的code的返回),而由於shell 中 eval 將後面的eval命令簡單當作命令字串執行,失去了巢狀作用,巢狀被命令替換取代。

linux中除錯shell指令碼

原來的指令碼check.sh monfile var log test testmon.txt logfile var log test testmon.log touch monfile 該指令碼是在window裡編輯的,編輯後上傳到linux的 問題 執行後,目錄下出現的檔案是testmon.t...

Linux 中shell指令碼之符號篇

shell簡介 shell的作用是解釋執行使用者的命令戶,有兩種執行方式 互動式 使用者輸入一條命令,shell就解釋執行一條 批處理 batch 使用者事先寫多個shell指令碼 script 其中有很多條命令,讓shell一次把這些命令執行完,而不必一條一條地敲命令。shell指令碼和程式語言很...

Linux中shell指令碼的基本語法

一 shell中有許多預定義的特殊字元 n n是乙個數字 大於10則用大括號括起來,代表程式的第n個引數 總共有多少個引數 指所有的引數 指所有的引數 上次命令執行的返回值 注意 我們發現 和 的意思是一樣的,其實它們兩個有乙個很大的區別 將所有引數放在一塊記憶體中,以空格分隔 將每個引數分別放在一...