namerefs
Eu acho que um nameref seria o que você quer:
name=foo
declare -a array_$name
declare -n target=array_$name
for x in asdf 'white space' ; do target+=("$x"); done
declare -p array_$name
saídas:
declare -a array_foo=([0]="asdf" [1]="white space")
eval, declare, deixe
O outro, pior, seria usar eval
ou declare
para definir os valores.
eval
fica complicado com as citações, você não deseja expandir acidentalmente $
s dentro de seus valores.
eval "array_$name+=(\"\$x\")"
declare
torna um pouco duvidoso implementar o acréscimo ao array. No entanto, é bastante simples se você conhece o índice para atribuir a:
declare "array_$name[$i]=$x"
(Obtendo o número de elementos em array_$name
parece exigir nameref ou eval
novamente.)
Você mencionou let
; é um pouco como declare
aqui, mas funciona com expressões aritméticas, então não é um bom ajuste para o caso geral.
name=a;
let "test_$name=12+34" # sets test_a to 46
let "test_$name=foo" # reads the _value_ of variable foo!
let "test_$name=foo bar" # this is an error.
estruturas de dados alternativas
Como alternativa, se houver apenas um de cada valor, inverta a estrutura de dados e armazene o ID do grupo de cada valor em uma única matriz:
for (( val=1; val <= 10; val++ )); do
groupid=$(find_groupid "$val")
variables[$val]=$groupid
done
Em seguida, percorra toda a matriz e ignore os grupos nos quais você não está interessado.
Ou, se seus valores não contiverem espaços em branco, apenas use strings para os arrays internos. Para fazer um loop sobre eles, faça algo como
for group in "${groups[@]}"; do
for item in $group; do # no quotes here, we want wordsplitting
...
(ou use um array associativo lá para armazenar os nomes dos grupos também).