1. 程式人生 > >linux下的eval指令

linux下的eval指令

  1. eval command-line
    其中command-line是在終端上鍵入的一條普通命令列。然而當在它前面放上eval時,其結果是shell在執行命令列之前掃描它兩次。如:
    pipe=”|”
    eval ls $pipe wc -l
    shell第1次掃描命令列時,它替換出pipe的值|,接著eval使它再次掃描命令列,這時shell把|作為管道符號了。
    如果變數中包含任何需要shell直接在命令列中看到的字元(不是替換的結果),就可以使用eval。命令列結束符(; | &),I/o重定向符(< >)和引號就屬於對shell具有特殊意義的符號,必須直接出現在命令列中。
  2. eval echo \$$#取得最後一個引數
    如:
    eval echo \$$#
    ./last one two three four
    four
    第一遍掃描後,shell把反斜槓去掉了。當shell再次掃描該行時,它替換了$4的值,並執行echo命令
    3.以下示意如何用eval命令建立指向變數的“指標”:
    x=100
    ptrx=x
    eval echo $$ptrx 指向ptrx,用這裡的方法可以理解b中的例子
    100 列印100
    eval $ptrx=50 將50存到ptrx指向的變數中。
    echo $x
    50 列印50

語法:eval cmdLine
eval會對後面的cmdLine進行兩遍掃描,如果第一遍掃描後,cmdLine是個普通命令,則執行此命令;如果cmdLine中含有變數的間接引用,則保證間接引用的語義。

舉例如下:
set 11 22 33 44
如果要輸出最近一個引數,即44,可以使用如下命令,
echo $4
但是如果我們不知道有幾個引數的時候,要輸出最後一個引數,大家可能會想到使用$#來輸出最後一個引數,
如果使用命令:

echo "\$$#"

則得到的結果是 $4,而不是我們想要的44。這裡涉及到一個變數間接引用的問題,我們的本意是輸出 $4,預設情況下,命令後忽略變數間接引用的情況。
這時候,就可以使用eval命令。
eval echo "\$$#"
得到的結果為44