Используйте nameref, eval
или косвенное указание для имитации вложенного массива.
- nameref:
foo=(a b c)
bar=(alpha beta chi)
arrays=(foo bar)
suffix=(.png .svg)
declare -n arr
let i=0
for arr in "${arrays[@]}"; do
for elem in "${arr[@]}"; do
echo "${elem}${suffix[i]}"
done
let i++
done
Это объявляет arr
как nameref. Когда вы оперируете arr
, вы фактически используете переменную, указанную значением arr
.
Вы можете добавить счетчик для внутреннего l oop с помощью let j=0
и let j++
, или выполните следующие действия:
for (( i = 0; i < ${#arrays[@]}; i++ )); do
declare -n arr="${arrays[i]}"
for (( j = 0; j < ${#arr[@]}; j++ )); do
echo "${arr[j]}${suffix[i]}"
done
done
eval
:
foo=(a b c)
bar=(alpha beta chi)
suffix=(.png .svg)
arrays=(foo bar)
for (( i = 0; i < ${#arrays[@]}; i++ )); do
eval "arr=( \${${arrays[i]}[@]} )"
for (( j = 0; j < ${#arr[@]}; j++ )); do
echo "${arr[j]}${suffix[i]}"
done
done
Это оценивает строку arr=( \${foo[@]} )
, которая создает массив arr
с элементами foo
.
косвенное обращение:
foo=(a b c)
bar=(alpha beta gama)
arrays=('foo[@]' 'bar[@]')
suffix=(.png .svg)
let i=0
for arr in "${arrays[@]}"; do
for elem in "${!arr}"; do
echo ${elem}${suffix[i]}
done
let i++
done
"${!arr}"
относится к массиву foo
или bar
, но мы не можем индексировать его или получить его длину (или есть что-то я пропустил?). Таким образом, мы не можем использовать for (( j = 0; ... ))
здесь.
Поиск Bash справочное руководство для соответствующей документации nameref, eval
и косвенного обращения.