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

时间:2018-02-05 08:53:38

标签: bash

我从属性文件中获取的参数列表如下:

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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得到扩展,提供您想要的内容。