linux命令eval的用法

1. eval command-line

其中commandline是在終端上鍵入的一條普通命令行。然而當在它前面放上eval時,其結果是shell在執行命令行之前掃描它兩次。如:

pipe="|"

eval ls $pipe wc -l

shell1次掃描命令行時,它替換出pipe的值|,接着eval使它再次掃描命令行,這時shell把|作爲管道符號了。

如果變量中包含任何需要shell直接在命令行中看到的字符(不是替換的結果),就可以使用eval。命令行結束符(; &),Io重定向符(< >)和引號就屬於對shell具有特殊意義的符號,必須直接出現在命令行中。

2. eval echo \$$# 取得最後一個參數

如:cat last

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簡析
1. 工作原理及用法  www.2cto.com  
用法:eval command-line
原理:eval主要用在對參數的特殊處理上面的,一般的命令行,shell處理參數就只執行一遍,像轉義和變量轉變;但加上eval後就可以對參數經行兩遍處理;網上有說是對command-line處理兩遍,我認爲是不合理的。一個eval只能使shell對參數多一次處理,因此有幾個eval就可以多加幾次,即eval eval command-line 這樣就能對參數進行三次編譯,但此時應特別注意參數的轉義,下面有例子說明。
eval命令會計算(evalue)它的參數,這些參數作爲表達式計算後重新組合爲一個字符串,然後作爲一個命令被執行。
eval最常見的用法是將動態生成的命令行計算並執行。例如:
$ name=woodie
$ cmd="echo Helllo $name\! "
$ eval $cmd
Hello woodie!
2. 舉例講解
例一:(網絡下載
pipe="|"
eval ls $pipe wc -l
shell第1次掃描命令行時,它替換出pipe的值|,接着eval使它再次掃描命令行,這時shell把|作爲管道符號了。
如果變量中包含任何需要shell直接在命令行中看到的字符(不是替換的結果),就可以使用eval。命令行結束符(; | &),I/o重定向符(< >)和引號就屬於對
shell具有特殊意義的符號,必須直接出現在命令行中。
x=100
ptrx=x
eval echo \$$ptrx 指向ptrx,用這裏的方法可以理解b中的例子
100 打印100
eval $ptrx=50 將50存到ptrx指向的變量中。
echo $x
50 打印50
例二:
root@localhost:~/test#set tao shou kun
root@localhost:~/test#echo \$$#
$3
root@localhost:~/test#eval echo \$$#
kun
root@localhost:~/test#
例三:(對三重的支持)
root@localhost:~/test#aabbcc=alibaba
root@localhost:~/test#a=aa
root@localhost:~/test#b=bb
root@localhost:~/test#c=cc
root@localhost:~/test#alibaba="hello world"
root@localhost:~/test#eval echo \$\$$a$b$c
11990aabbcc
root@localhost:~/test#eval echo \\$\$$a$b$c
$alibaba
root@localhost:~/test#eval eval echo \$\$$a$b$c
11990aabbcc
root@localhost:~/test#eval eval echo \\$\$$a$b$c
hello world
注意這裏的參數轉義,第一遍處理後參數應該是:\$$aabbcc,第二次是:$alibaba,第三次就正好是:hello world。
附eval用法三例(網絡收集):
例一:
#尋找合符條件的變量名,然後將該變量的值賦予另一變量
v1=aaa
v2=bbb
c=1
if [ $c -eq 1 ]
then
vname=v$c #找到符合條件的變量名爲v1
eval vvv="$"$vname ; echo vvv: $vvv #將變量v1的值賦予vvv,即,使vvv=aaa
eval vvv='$'$vname ; echo vvv: $vvv #將變量v1的值賦予vvv,即,使vvv=aaa
#eval vvv=$$vname ; echo vvv: $vvv #錯誤用法
fi
#例二:
#以變量v1的值aaa作爲變量名,將變量vaaa的值賦予這一新定義的變量aaa
v1=aaa ; vaaa="This is aaa"
#eval $v1=$vaaa ; echo aaa: $aaa #錯誤用法
#eval $v1="$vaaa" ; echo aaa: $aaa #錯誤用法
eval $v1='$vaaa' ; echo aaa: $aaa
#例三:
#以變量v1的值aaa作爲變量名,並將變量名字串作爲值賦予自身
v1=aaa ; vaaa="This is aaa"
eval $v1=$v1 ; echo aaa: $aaa #與例二的錯誤用法不同,這一用法是正確的
eval $v1="$v1" ; echo aaa: $aaa #與例二的錯誤用法不同,這一用法是正確的
eval $v1='$v1' ; echo aaa: $aaa


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