天天看點

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,而不是我們想要的。這裡涉及到一個變量間接引用的問題,我們的本意是輸出 $4,預設情況下,指令後忽略變量間接引用的情況。
這時候,就可以使用eval指令。
eval echo "\$$#"
得到的結果為
           

繼續閱讀