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`
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值