Shell 用变量的值作为新的变量名,eval命令的简单解释

背景

我为什么有这个需求?
我有三台服务器分别是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`

你可能感兴趣的:(shell)