背景
我为什么有这个需求?
我有三台服务器分别是server1,server2,server3,我需要写一个脚本在三台主机运行的时候分别执行不同的参数。
server1=close sth on server3
server2=close sth on server3
server3= close sth on server3
我的期待:
sh `python \$$(hostname) 参数`
hostname就是server1,2,3.但这样做根本行不通。因为shell只对命令解析一次得到的输出是 $server1
eval命令
对shell命令做两次解析。※普通shell只对命令做一次解析。
- $变量名 意思是获取变量的值
- $$ 当前Shell进程ID。
- \$ $ 斜杠防止第一次shell解析时被当作特殊变量"$$"被扩展
example1
没有eval时
[root@izuf61vzhmpllsrk4narjxz test]# aa=25 bb=aa
[root@izuf61vzhmpllsrk4narjxz test]# echo \$$bb
$aa
执行过程:
仅扫描一次:$bb获取到了bb的值aa成功替换 ,替换后$aa作为字符串,执行echo `$aa` 直接输出 `$aa`
有eval时
[root@izuf61vzhmpllsrk4narjxz test]# eval echo \$$bb
25
执行过程:
一次扫描时(同上):$bb获取到了bb的值aa成功替换 ,替换后整个命令变成了
echo $aa
第二次扫描时: 发现命令$aa ,执行替换获取到25,执行echo 25 ,输出 25
example2
aa=25
[root@izuf61vzhmpllsrk4narjxz test]# bb='$aa'
[root@izuf61vzhmpllsrk4narjxz test]# echo $bb
$aa
[root@izuf61vzhmpllsrk4narjxz test]# eval echo $bb
25
## eval 执行过程同上
1 echo $aa
2 echo 25
输出25
工作实际应用
#!/bin/sh
server1=close sth on server3
server2=close sth on server3
server3= close sth on server3
serverhost=$(eval echo \$$(hostname))
echo $serverhost
根据主机不同,分别执行不同参数
echo `python alislb.py $serverhost 0`