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

匿名 (未验证) 提交于 2019-12-02 23:43:01

背景

我为什么有这个需求?
我有三台服务器分别是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
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!