在bash中使用另一个参数内的参数

问题描述 投票:0回答:2

我有一个从属性文件中获取的参数列表如下所示:

db_instanceid=i-0c2b12ae02d454018
db_secgrp=sg-8c2efcf3
backend_instanceid=i-0199621ba358d1814
backend_secgrp=sg-5e508221
frontend_instanceid=i-0199621ba358d1814
frontend_secgrp=sg-e152809e

在bash中,我想使用数组来执行使用这些参数的操作,类似于:

declare -a arr=("frontend" "backend" "db")
for i in "${arr[@]}"
do
   inter=$i  
   echo "Get PublicIp for $inter server"
   echo "$inter security group - $inter_secgrp" ; 
done

但$ inter_secgrp本身将作为参数读取,所以我得到一个空字符串(这是有意义的)。如何以正确的方式读取此参数,以便获得所有“secgrp”的值

需要的输出:

Get PublicIp for frontendserver
frontendserver security group - sg-e152809e

Get PublicIp for backend
backendsecurity group - sg-5e508221

Get PublicIp for db
dbsecurity group - sg-8c2efcf3
bash
2个回答
3
投票

可以通过间接扩张来实现

. parameterfile
declare -a arr=("frontend" "backend" "db")
for inter in "${arr[@]}"
do
   echo "Get PublicIp for $inter server"
   inter_secgrp=${inter}_secgrp
   echo "$inter security group - ${!inter_secgrp}" ;
done

0
投票

使用eval的诱惑在这里特别强烈。

. parameterfile
declare -a arr=("frontend" "backend" "db")
for inter in "${arr[@]}"
do
   echo "Get PublicIp for $inter server"
   eval inter_secgrp=\$${inter}_secgrp
   echo "$inter security group - $inter_secgrp" ;
done

然后$inter_secgrp是你想要的。

简单来说,eval告诉Bash在执行之前额外评估该行。在第一次评估之后,eval线转向(例如

eval inter_secgrp=$db_secgrp

然后再次评估eval之后的事情,所以$db_secgrp得到扩展,给出你想要的东西。

© www.soinside.com 2019 - 2024. All rights reserved.