eval
格式:eval [argument...]
可以二次迭代參數中的引用變量,然後將參數作爲命令,在shell中執行
如果是多個參數,那麼變量替換之後必須符合某個命令的格式,否則eval會報錯“**未找到命令”
與echo的區別:
- echo 對後面參數中的引用變量只能進行一次迭代
- echo 後面的參數是作爲字符串輸出到命令行,而不是作爲命令在shell中執行
示例:
-
一次迭代可以解析引用變量的嵌套
# 引用變量的嵌套 file="txt.txt" dir="~/testcase/$file" t="cat $dir" echo $t eval echo $t eval $t # 輸出結果 # $t 解析爲 cat ~/testcase/txt.txt,然後作爲 echo 命令的參數,輸出到終端 cat ~/testcase/txt.txt # 先將 $t 解析爲 cat /home/lfp/testcase/txt.txt,再將 echo cat /home/lfp/testcase/txt.txt 作爲命令, # 在shell中執行,echo 命令的作用便是將後面的參數作爲字符串輸出到終端 cat /home/lfp/testcase/txt.txt # 先將 $t 解析爲 cat /home/lfp/testcase/txt.txt,再將 cat /home/lfp/testcase/txt.txt 作爲命令,在shell中執行 test case txt file # 此爲 txt.txt 文件中的內容,作爲cat 命令的執行結果輸出到終端
-
二次迭代可以解析,一次迭代後,和參數中的'$',組成的,新的引用變量
lfp@legion:~$ days=365 lfp@legion:~$ year=days lfp@legion:~$ echo $year days lfp@legion:~$ echo \$$year $days # 第一次 $year 解析爲 days,跟參數中的 $,組合成新的引用變量 $days,變爲 eval echo $days # 第二次 $days 解析爲365,變爲 eval echo 365,消除了引用變量,於是將 echo 365 作爲命令,在shell中執行 # 替換之後的參數爲 echo 365 符合echo命令格式,於是在shell中執行 echo 365 這個命令,輸出 365 lfp@legion:~$ eval echo \$$year 365 # 參數 \$$year 被兩次解析爲365,eval 便將 365 作爲命令,在shell中執行,但是365 不是一個命令,所以報錯 lfp@legion:~$ eval \$$year 365:未找到命令
-
官方例子改編
# 定義兩個變量 lfp@legion:~$ foo=10 x=foo # 一般命令的執行,對於引用變量只解析一次 # 下面命令的執行結果是 y=$foo lfp@legion:~$ y='$'$x # 先解析爲 '$'foo,再賦值給變量 y lfp@legion:~$ echo $y $foo lfp@legion:~$ echo y='$'$x # 先解析爲 y='$'foo,再作爲echo命令的參數,輸出到終端 y=$foo lfp@legion:~$ echo $y $foo # eval 可以兩次迭代引用變量 lfp@legion:~$ eval echo y='$'$x y=10 lfp@legion:~$ echo $y # y=10 未作爲命令在shell中執行,變量 y 的值未改變 $foo lfp@legion:~$ eval y='$'$x lfp@legion:~$ echo $y # y=10 作爲命令在shell中執行,變量 y 的值被改變 10
-
測試3次迭代
lfp@legion:~$ a=b lfp@legion:~$ b=c lfp@legion:~$ c=d lfp@legion:~$ eval echo $a b lfp@legion:~$ eval echo '$'$a c # 自己測試沒有3次迭代 lfp@legion:~$ eval echo '$''$'$a 21947b
參考
https://unix.stackexchange.com/a/23115
http://cn.linux.vbird.org/linux_basic/Mandrake9.0/0320bash.php#eval