A página do manual Bash descreve o uso de ${!a}
para retornar o conteúdo da variável cujo nome é o conteúdo de a
(um nível de indireção).
Eu gostaria de saber como retornar todos os elementos em uma matriz usando isso, ou seja,
a=(one two three)
echo ${a[*]}
retorna
one two three
Eu gostaria de:
b=a
echo ${!b[*]}
para retornar o mesmo. Infelizmente, não, mas retorna 0
.
Atualizar
Dadas as respostas, agora percebo que meu exemplo era muito simples, pois é claro, algo como:
b=("${a[@]}")
Alcançará exatamente o que eu disse que precisava.
Então, aqui está o que eu estava tentando fazer:
LIST_lys=(lys1 lys2)
LIST_diaspar=(diaspar1 diaspar2)
whichone=$1 # 'lys' or 'diaspar'
_LIST=LIST_$whichone
LIST=${!_LIST[*]}
Obviamente, a leitura cuidadosa da página de manual do Bash mostra que isso não funcionará conforme o esperado, porque a última linha simplesmente retorna os índices da "matriz" $_LIST
(não uma matriz).
Em qualquer caso, o seguinte deve fazer o trabalho (conforme indicado):
LIST=($(eval echo \${$_LIST[*]}))
ou ... (a rota que segui, eventualmente):
LIST_lys="lys1 lys2"
...
LIST=(${!_LIST})
Supondo, é claro, que os elementos não contenham espaços em branco.
[@]
ao ponteiro_LIST="LIST_${whichone}[@]"
e, em seguida, useLIST=("${!_LIST}")
para copiar a matriz. É uma boa idéia usar nomes de variáveis em minúsculas para evitar conflitos com variáveis de ambiente (Todas as maiúsculas).