eval擅長處理有復雜變量的命令行,eval會對命令行進行2次掃描,第一次進行變量替換,第二次再執行變量替換後的命令行...
功能演示:
[root@db02 ~]# a=1
[root@db02 ~]# b=\$a
[root@db02 ~]# echo $b
$a
[root@db02 ~]# eval echo $b #這裡等於先輸出了$a,再執行了$a返回了數字1
1
eval結合set傳參案例一
解答一些服務的啟動腳本runlevel=$(set -- $(runlevel); eval "echo \$$#" ) 這個runlevel是怎麼把這個運行級別的取到的?
[root@db02 ~]# runlevel=$(set -- $(runlevel); eval "echo \$$#" )
[root@db02 ~]# echo $runlevel
3
分解命令正常的運行步驟是這樣的:
1)set傳參,$1和$2
[root@db02 ~]# set -- $(runlevel)
[root@db02 ~]# echo $1
N
[root@db02 ~]# echo $2
3
2)eval2次掃描,得到$2的結果為3
[root@db02 ~]# echo \$$#
$2
[root@db02 ~]# eval echo \$$#
3
3)輸出結果
[root@db02 ~]# runlevel=$2
[root@db02 ~]# echo $runlevel
3
eval結合數組用法案列二
設i=1,arrary=(a,b,c),如何才能得到 ${array$i[@]}的結果?
[root@db02 ~]# i=1
[root@db02 ~]# arrary=(a,b,c)
[root@db02 ~]# echo ${array$i[@]}
-bash: ${array$i[@]}: bad substitution
正確的做法:
[root@db02 ~]# i=1
[root@db02 ~]# array1=(a b c)
[root@db02 ~]# echo $\{array$i[@]}
${array1[@]}
[root@db02 ~]# eval echo $\{array$i[@]}
a b c