背景
我为什么有这个需求?
我有三台服务器分别是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解析时被当作特殊变量"$$"被扩展
防止第一次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` 文章来源: https://blog.csdn.net/kouryoushine/article/details/91959556