shell eval命令使用

foreverfriends發表於2017-04-18
eval命令將會首先掃描命令列進行所有的置換,然後再執行該命令。
該命令適用於那些一次掃描無法實現其功能的變數。該命令對變數進行兩次掃描。
這些需要進行兩次掃描的變數有時被稱為複雜變數。不過這些變數本身並不複雜。
eval命令也可以用於回顯簡單變數,不一定是複雜變數。

1.eval命令也可以用於回顯簡單變數,不一定是複雜變數
例如: 

[neau@mail ~]$ NAME=VALUEBANK
[neau@mail ~]$ eval echo $NAME
VALUEBANK
[neau@mail ~]$ echo $NAME
VALUEBANK

2.執行含有字串的命令
首先我們首先建立一個名為test的小檔案,在這個小檔案中含有一些文字。接著,將cat test賦給變數myfile,現在我們e c h o該變數,看看是否能夠執行上述命令。
[neau@mail ~]$ vi test
[neau@mail ~]$ cat test
Hello World!!!
I am a chinese Boy!
將cat testf賦給變數myfile
[neau@mail ~]$ myfile="cat test"
如果我們echo該變數,我們將無法列出test檔案中的內容。
[neau@mail ~]$ echo $myfile
cat test
讓我們來試一下eval命令,記住eval命令將會對該變數進行兩次掃瞄。
[neau@mail ~]$ eval $myfile
Hello World!!!
I am a chinese Boy!
從上面的結果可以看出,使用eval命令不但可以置換該變數,還能夠執行相應的命令。第一次掃描進行了變數置換,
第二次掃描執行了該字串中所包含的命令cat test。

3.命令還可以用來顯示出傳遞給指令碼的最後一個引數
[neau@mail ~]$ cat test1
#!/bin/bash
echo "Total of the arguments passed $#"
echo "The process Id is $$"
echo "Last argument is "$(eval echo \$$#)""
[neau@mail ~]$ ./test1 value bank test last
Total of the arguments passed 4
The process Id is 21545
Last argument is last
在上面的指令碼中, eval命令首先把$$#解析為當前shell的引數個數,然後在第二次掃描時得出最後一個引數。

4.給每個值一個變數名
可以給一個值一個變數名。下面我對此做些解釋,假定有一個名為test2的檔案:
[neau@mail ~]$ cat test2
CCTV 5
CHANGEL SPORTS
LIKE YES
你希望該檔案中的第一列成為變數名,第二列成為該變數的值,這樣就可以:
[neau@mail ~]$ cat test2
COMMANY TQ
LANGUE ENGLISH
LIKE YES
[neau@mail ~]$ cat test3
#!/bin/bash
while read NAME VALUE
do
eval "${NAME}=${VALUE}"
done  
echo "$COMMANY $LANGUE $LIKE"
[neau@mail ~]$ ./test3
TQ ENGLISH YES

相關文章