Loop through array of arrays of string with spaces
I think you meant that the output should look like:
AA QQBB LLCCDDEEFF
i.e.:
${low1[0]}${low1[1]}${low2[0]}${low2[1]}${low3[0]}${low3[1]}
This could be accomplished using:
#!/bin/bashlow1=("AA QQ" "BB LL")low2=("CC" "DD")low3=("EE" "FF")high=(low1 low2 low3)for high_item in ${high[@]}do x="${high_item}[@]" # -> "low1[@]" arrays=( "${!x}" ) #IFS=$'\n' for item in "${arrays[@]}" do echo "$item" donedone
And please always use #!/bin/bash
for bash scripts.
Explanation: ${!x}
is indirect variable expansion. It evaluates to the value of variable with a name contained in $x
.
For our needs, x
needs to have the [@]
suffix for array expansion as well. Especially note that it is x=${high_item}[@]
and not x=${high_item[@]}
.
And you have to evaluate it in array context; otherwise, it wouldn't work as expected (if you do arrays=${!x}
).
Ah, and as final note: IFS
doesn't make any difference here. As long as you are working on quoted arrays, IFS
doesn't come into play.
Replace eval
with indirect parameter expansion, and you'll get what I think you want (although it doesn't match your current given output:
for high_item in "${high[@]}"do arrayz="$high_item[@]" # arrayz is just a string like "low1[@]" for item in "${!arrayz}" do echo $item donedone
Note the need to quote the array expansion in the inner loop to preserve the whitespace in elements of low1
.