1

Is dynamic parameter expansion possible in Bash?

$ TEST_1=12345
$ TEST_2=54321
$ for i in 1 2; do echo ${TEST_$i}; done
-bash: ${TEST_$i}: bad substitution
$ echo ${!TEST_*}
TEST_1 TEST_2

Desired output:

$ for i in 1 2; do echo ${TEST_$i}; done
12345
54321
NarūnasK
  • 4,564
  • 8
  • 50
  • 76

1 Answers1

2

You can use indirect parameter expansion (see man bash):

If the first character of parameter is an  exclamation  point  (!),  it
introduces a level of variable indirection.  Bash uses the value of the
variable formed from the rest of parameter as the name of the variable;
this  variable  is  then expanded and that value is used in the rest of
the substitution, rather than the value of parameter itself.   This  is
known as indirect expansion.  The exceptions to this are the expansions
of ${!prefix*} and ${!name[@]} described below.  The exclamation  point
must  immediately  follow the left brace in order to introduce indirec-
tion.

That is:

for i in 1 2; do var="TEST_$i"; echo "${!var}"; done

Test:

$ TEST_1=12345
$ TEST_2=54321 
$ for i in 1 2; do var="TEST_$i"; echo "${!var}"; done
12345
54321
Micha Wiedenmann
  • 19,979
  • 21
  • 92
  • 137
sat
  • 14,589
  • 7
  • 46
  • 65