博客园  :: 首页  :: 管理

今天笔者在写一个脚本时,遇到了一种技术难点,就是一个变量值的部分内容,引用了另外一个变量,很多地方称这种技术为间接变量的引用

脚本实现的部分逻辑为:定义了多个关联数组(关联数组不支持二维级多维),需要对多个关联数组的键进行遍历取值

这样,笔者在定义多个关联数组时,变量的名字就定义的相对规律一些,如server_01 、server_02

在使用for遍历时,需要先得到这些关联数组,然后再取它的固定的键的值,笔者最开始使用如下方法:

#!/bin/bash
#

declare -A server_01 server_02

server_01[instance_id]=i-0c2f35d32afcadd5b
server_01[user]=qq_5201351

server_02[instance_id]=i-0323eabc546829ead
server_02[user]=qq_5201351

for server in server_{01..02};do
     instance_id=${$server[instance_id]}
     user=${$server["user"]}
     echo $instance_id $user
done

这样执行时,就会直接报错:xxx.sh: line 13: ${$server[instance_id]}: bad substitution

解决方法:对于关联数组这种场景,笔者能想到的只有如下一种使用eval的方法:

#!/bin/bash
#

declare -A server_01 server_02

server_01[instance_id]=i-0c2f35d32afcadd5b
server_01[user]=qq_5201351

server_02[instance_id]=i-0323eabc546829ead
server_02[user]=qq_5201351

for server in server_{01..02};do
     eval instance_id=\${$server[instance_id]}
     eval user=\${$server["user"]}
     echo $instance_id $user
done

执行结果,就是正常的,我们想要得到的结果

i-0c2f35d32afcadd5b qq_5201351
i-0323eabc546829ead qq_5201351

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

补充,对于普通的变量,还有一种方式,是可以通过${!var}进行间接变量取值,效果如下:

var=name
name=admin
echo ${!var}

这样也可以通过var变量得到name变量的值,最终输出admin,但是这样方式,不合适上面案例中的关联数组的场景

 

 

 

尊重别人的劳动成果 转载请务必注明出处:https://www.cnblogs.com/5201351/p/15587703.html