Linux shell之eval、``與$()

eval、``、$()是Linux Shell下,三種個功能類似的命令,都可以用來命令替換。

特別需要注意的是第二個` `這兩個字符不是單引號,是反引號,在標準美國鍵盤上的ESC鍵下面,在字符1左邊,在TAB鍵上面的那個鍵,要特別留心。

eval探究:

eval命令將會首先掃描命令行進行所有的置換,然後再執行該命令。

也就是說,eval命令有兩步。

  1. 第一步,掃描,並置換。類似於C語言中編譯期間的宏替換
  2. 第二部,執行替換之後的命令。類似於C語言運行期間,將替換後的值帶入程序中運行計算。
這是eval最重要的功能。該命令適用於那些一次掃描無法實現其功能的變量,該命令對變量進行兩次掃描。這些需要進行兩次掃描的變量有時被稱爲複雜變量。不過這些變量本身並不複雜。eval命令也可以用於回顯簡單變量,不一定是複雜變量。當然,eval還有許多其他的用法,下面一一介紹:

1,eval用來顯示覆雜變量(變量是表示命令的字符串)

可以發現:
eval將$NAME進行掃描,替換爲字符串命令“ll -i”,然後執行該命令。


可以發現:
在上面的代碼中,用NAME2=NAME,但是執行eval NAME2時,第一步走完後,將該命令行替換爲NAME,然後執行NAME。
但是,NAME並不是可執行命令,而NAME需要再次替換爲“ll -i”,才能執行。所以,顯示“NAME:command not found”。

2,eval用來顯示簡單變量,而不是複雜變量。

可以發現:
NAME2表示簡單變量時,直接"eval $NAME2"會顯示“VALUE:command not found”錯誤,道理和上面敘述一樣。
echo $NAME2顯示出來了NMAE2本該替換的值VALUE。
而eval echo $NAME2也顯示了VALUE,是因爲eval掃描本命令行,將$NAME2替換成了VALUE,本命令行變爲了“echo VALUE”,所以,執行之後,當然顯示VALUE了。

3,eval用來顯示傳遞給腳本的最後一個參數
創建一個test.sh文件,寫入如下內容

在命令行中輸入如下命令,顯示:

可以發現,最後一句話,顯示的是傳遞給腳本的最後一個參數。

因爲:$#表示的是參數個數,而$5顯示傳遞的第5個參數值。

所以,eval  echo \$$#,第一步,替換爲“echo $5”,然後,第二步,執行該命令,就顯示arg5.



``簡介:

使用``(反引號)引住的命令執行結果能賦值給一個變量。它也被稱爲後引號(backquotes)或是斜引號(backticks)。

比如:如下示例圖:


(注:本人的hostname是ubuntu)

可以發現:該A用來存放命令的結果。使用$A提示的是,該變量表示的內容不是一個命令,說明了bash是直接將$A看做是A表示的內容。使用echo可以直接打印出來。

與eval不同的是:

eval是先替換,再運行。

而``卻是提前將結果放在了變量中。可以看做是,先運行放在變量中,然後在使用時候,替換。


$()簡介:
$()的使用於``類似。Shell掃描命令行,發現了$(command)結構,便將$(command)中的command執行一次,得到其標準輸出,再將此輸出放到原來命令行中$(command)的位置,即替換了$(command),再執行整個命令行。
可以發現,兩者功能,基本相同。所以與eval的區別和``一樣。


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