保定網(wǎng)站優(yōu)化/百seo排名優(yōu)化
這個(gè)命令,平時(shí)接觸不是很多,所以不知道是什么回事。
eval內(nèi)置命令:
功能:當(dāng)Shell程序執(zhí)行到eval語(yǔ)句的時(shí)候,Shell讀入?yún)?shù)args,并將它們組合成一個(gè)新的命令,然后執(zhí)行。也就是重新運(yùn)算求出參數(shù)的內(nèi)容。eval可以讀取一連串的參數(shù),然后依據(jù)參數(shù)本身的特性來(lái)執(zhí)行。參數(shù)不限數(shù)目,彼此之間用分號(hào)分開。
eval會(huì)對(duì)后面的命令進(jìn)行兩遍的掃描,如果第一遍掃描后,命令是普通命令,則執(zhí)行此命令;如果命令中含有變量的間接引用,則保證間接引用的語(yǔ)義。也就是說,eval語(yǔ)句將會(huì)首先掃描命令行進(jìn)行所有的置換,然后再進(jìn)行該命令。因此,eval命令適合用于那些一次掃描無(wú)法實(shí)現(xiàn)其功能的變量。
eval執(zhí)行分兩個(gè)步驟:
第一步:執(zhí)行變量的替換。
第二步:執(zhí)行替換后的命令。
示例1:
[root@vm1 scripts]# cat noeval.sh
echo \$$#
[root@vm1 scripts]# sh noeval.sh arg1 arg2
$2
[root@vm1 scripts]# cat eval.sh
eval "echo \$$#"
[root@vm1 scripts]# sh eval.sh arg1 arg2
arg2
代碼說明:
1)\$$#? ?$#是特殊變量,表示傳參的個(gè)數(shù),然后前面的\$是轉(zhuǎn)義,顯示$。
2)沒有加eval的時(shí)候,只是進(jìn)行了第一步變量的替換,將傳參的個(gè)數(shù)2替換了$#。然后就進(jìn)行了顯示。
3)加了eval語(yǔ)句,則進(jìn)行了兩次掃描,第一次,是變量的替換。然后再執(zhí)行替換后的命令,顯示$2的值,也就是arg2。
4)這個(gè)例子很典型。
如果我們知道參數(shù)的個(gè)數(shù),如我們輸入兩個(gè)參數(shù)arg1 arg2,我們可以使用$2來(lái)查看最后一個(gè)參數(shù)arg2。
但是如果我們不知道參數(shù)個(gè)數(shù),還想查看最后一個(gè)參數(shù)怎么辦呢?我們想到$#,傳給Shell腳本的個(gè)數(shù),echo $#顯示的其實(shí)是參數(shù)個(gè)數(shù),而使用eval echo "$$#" 才顯示最后一個(gè)參數(shù)。跟示例1一樣。
示例2:
[root@vm1 scripts]# cat test
Hello world!
[root@vm1 scripts]# WORD="cat test"
[root@vm1 scripts]# echo $WORD
cat test
[root@vm1 scripts]# eval $WORD
Hello world!
代碼說明:
1)eval命令對(duì)后面的命令進(jìn)行了兩次掃描,第一次將$WORD替換為cat test,第二次執(zhí)行cat test。
2)這些需要進(jìn)行兩次掃描的變量有時(shí)也稱為復(fù)雜變量。不過這些變量并不復(fù)雜。
?示例3:
回顯簡(jiǎn)單變量:
[root@vm1 scripts]# NAME=filename
[root@vm1 scripts]# echo $NAME
filename
[root@vm1 scripts]#
[root@vm1 scripts]# eval echo $NAME
filename
示例4:
在file文件中,有兩列數(shù)據(jù),第一列對(duì)應(yīng)KEY,第二列對(duì)應(yīng)VALUE,使用eval命令將KEY和VALUE的值對(duì)應(yīng)起來(lái),從文件中讀取。
[root@vm1 scripts]# cat file
NAME chang
AGE 28
SEX nan
[root@vm1 scripts]# cat file1.sh
#!/bin/bash
while read KEY VALUE
doeval "${KEY}=${VALUE}"
done < file
echo "$NAME $AGE $SEX"
[root@vm1 scripts]# sh file1.sh
chang 28 nan
需要注意的是:
1)eval不能獲得函數(shù)的返回結(jié)果;
2)eval無(wú)嵌套的意義。shell中的eval將后面的eval命令簡(jiǎn)單當(dāng)作命令字符串執(zhí)行,失去了嵌套作用,嵌套被命令替換取代。