我有一个从属性文件中获取的参数列表如下所示:
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
可以通过间接扩张来实现
. 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
使用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
得到扩展,给出你想要的东西。