I try to make this (example...) :
list1 = ("one" "two" "three")
list2 = ("four" "five" "six")
list3 = ("seven" "eight" "nine")
listn (finite number)...
for i in {1..n}; do
list= ${list[$i][@]}
echo "The elements of list $i are : $list"
done
but
${list[$i][@]}
is wrong ("substitution" error).
Can you help me?
CodePudding user response:
Firstly, you cannot have spaces around the equal sign in variable assignments.
The "classical" sh answer would be to use eval, however bash has the the notion of 'nameref' variables for variable indirection. They are be declared with declare -n like so:
list1=("one" "two" "three")
list2=("four" "five" "six")
list3=("seven" "eight" "nine")
for i in {1..3}; do
declare -n varptr=list$i
list=${varptr[@]}
echo "The elements of list $i are : $list"
done
Output:
$ bash /tmp/x.sh
The elements of list 1 are : one two three
The elements of list 2 are : four five six
The elements of list 3 are : seven eight nine
CodePudding user response:
You can use eval for double substitution in bash. In the first pass only inner variable is substituted and \$ is not used for substitution but replaced with $ and it is used for substitution in the second pass. Sample code is:
#! /bin/bash
list1=("one" "two" "three")
list2=("four" "five" "six")
list3=("seven" "eight" "nine")
for i in {1..3}; do
list=$(eval echo \${list$i[@]})
echo "The elements of list $i are : $list"
done
