Eu quero escrever um script para referenciar várias matrizes de outra matriz que contém os nomes de variáveis dessa matriz.
Aqui está o meu código até agora:
#!/bin/bash
array1=('array1string1' 'array1string2')
array2=('array2string1' 'array2string2')
array_names=('array1' 'array2')
for a in ${array_names[@]}
do
for b in ${a[@]}
do
echo $b
done
done
Gostaria que a saída digitalizasse as duas matrizes (a partir do loop for externo) e imprimisse as respectivas strings no loop for interno que chama eco. Minha saída atual está apenas me mostrando:
array1
array2
Eu ficaria grato por qualquer indicação sobre isso. Obrigado!
bash
shell-script
chnppp
fonte
fonte
for b in "${array1[@]}" "${array2[@]}"; do ...; done
?${a[@]}
para${!a}
o que você deseja (eu acho).${!a[@]}
fornece um comprimento da matriza
.${!a}
é apenas me dar os primeiros elementos.Respostas:
O Bash 4.3 e versões posteriores suportam "referências de nomes" ou namerefs (existe um conceito semelhante
ksh93
, mas o escopo é irritantemente diferente ):A variável
arr
é um nameref que age como um alias para a variável nomeada (a variável com nome$a
neste exemplo).Sem namerefs, nas versões anteriores do Bash, uma solução seria criar uma nova matriz que contenha todos os elementos das outras matrizes:
... um pouco como a
array_names
matriz da pergunta, mas com o conteúdo de todas as matrizes e, em seguida, iterar"${all[@]}"
.Também é possível usar
eval
, mas o código resultante parece surpreendentemente terrível.Veja a resposta de glenn jackman para uma variação com indireção variável (introduzida em sua forma atual com a versão 2 do Bash).
fonte
@Kusalananda tem a melhor resposta para versões recentes do bash. Para versões anteriores, você pode usar uma variável indireta:
Consulte o quarto parágrafo de https://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion
fonte
Como uma variação do que foi dito:
Acessando os elementos por índice
fonte