What I have is an array with some variables. I can iterate to get the values of those vars but what I need is actually their names (values will be used elsewhere).
Going with var[i] won’t work cause I will have different names. I guess I could workaround this by creating another array with the names – something similar to this: Getting variable values from variable names listed in array in Bash
But I’m wondering if there is a better way to do this.
var1=$'1' var2=$'2' var3=$'3' Array=( $var1 $var2 $var3) for ((i=0; i<${#Array[@]}; i++)) do echo ${Array[i]} done
Is:
>1 >2 >3
Should be:
>var1 >var2 >var3
Advertisement
Answer
It sounds like you want an associative array.
# to set values over time declare -A Array=( ) || { echo "ERROR: Need bash 4.0 or newer" >&2; exit 1; } Array[var1]=1 Array[var2]=2 Array[var3]=3
This can also be assigned at once:
# or as just one assignment declare -A Array=( [var1]=1 [var2]=2 [var3]=3 )
Either way, one can iterate over the keys with "${!Array[@]}"
, and retrieve the value for a key with ${Array[key]}
:
for var in "${!Array[@]}"; do val="${Array[$var]}" echo "$var -> $val" done
…will, after either of the assignments up top, properly emit:
var1 -> 1 var2 -> 2 var3 -> 3