Shahar Hamuzim Rajuan
Shahar Hamuzim Rajuan

Reputation: 6129

in bash use parameter inside another parameter

I have list of parameters that take from a property file looks like that:

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

in bash, I want to use an array to perform actions using those parameters, Something like that:

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

But $inter_secgrp itself will be read as a parameter, so I get an empty string (which make sense). How can I read this parameter the right way so I will get the value of all "secgrp"

needed output:

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

Upvotes: 0

Views: 47

Answers (2)

iBug
iBug

Reputation: 37217

The temptation to use eval is particularly strong here.

. 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

And then $inter_secgrp is what you want.

To be simple, eval tells Bash to evaluate the line for an extra time before executing it. Here after the first evaluation, the eval line turns to (for example

eval inter_secgrp=$db_secgrp

And then things after eval is evaluated again, so $db_secgrp gets expanded, giving what you want.

Upvotes: 0

123
123

Reputation: 11216

Could do it with indirect expansion

. 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

Upvotes: 3

Related Questions