Once I added the missing do
and done
into your code:
array=("list1item1 list1item2" "list2item list2item2")
for list in "${array[@]}"
do
for item in $list
do
echo $item
done
done
it produced the expected output:
list1item1
list1item2
list2item
list2item2
It's not clear to me how this differs from your expectation.
However, that is not a very general way of nesting a list into an array, since it depends on the internal list being IFS-separated. Bash does not offer nested arrays; an array is strictly an array of strings, and nothing else.
You can use indirection (${!v}
) and store variable names into your outer array, although it is a bit ugly. A less ugly variant is the following, which relies on namerefs; it will work with reasonably recent bash versions:
array=(list1 list2)
list1=("list 1 item 1" "list 1 item 2")
list2=("list 2 item 1" "list 2 item 2")
for name in "${array[@]}"; do
declare -n list=$name
for item in ${list[@]}; do
echo "$item"
done
done
Output:
list 1 item 1
list 1 item 2
list 2 item 1
list 2 item 2