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