Trabalhar com array no Bash
Pretendo deixar mais claro aqui como trabalhar com arrays no bash. Espero que após ler esse artigo não restem dúvidas tais como: Quando devo usar? Por que devo usar? Quando não usar? Quais são as possíveis formas de se declarar um array? Posso trabalhar com índices alfanuméricos?
Parte 5: Posso trabalhar com índices alfanuméricos?
Em certas linguagens é possível usar valores alfanuméricos como índices em um array, em shell isso não é possível, apenas números inteiros são aceitos.
Vamos ver o que ocorre quando tentamos usar uma letra como índice:
$ array[a]='valor1'
$ echo ${array[a]}
valor1
Quando olhamos isso realmente parece que funciona, mas não se deixe enganar, isso NÃO está funcionando, vamos analisar com calma para vermos o porque disso estar errado.
$ array[b]='valor2'
$ echo ${array[b]}
valor2
Novamente parece que funciona, mas NÃO está funcionando, vamos olhar novamente o índice 'a':
$ echo ${array[a]}
valor2
Viu, esperávamos que viesse o 'valor1'; porém o que apareceu foi o 'valor2'; mas por quê? O bash não deu erro. Vamos a explicação:
Primeiro vamos ver como o array está armazenado:
array=([0]="valor2")
Como pode ser, somente há o valor '0', não há nem 'a', muito menos 'b'; para entendermos porque isso ocorreu basta fazer:
$ echo $((a)) 0
O shell sempre converte as letras para o número zero, por isso que tivemos esse problema.
Vamos ver o que ocorre quando tentamos usar uma letra como índice:
$ array[a]='valor1'
$ echo ${array[a]}
valor1
Quando olhamos isso realmente parece que funciona, mas não se deixe enganar, isso NÃO está funcionando, vamos analisar com calma para vermos o porque disso estar errado.
$ array[b]='valor2'
$ echo ${array[b]}
valor2
Novamente parece que funciona, mas NÃO está funcionando, vamos olhar novamente o índice 'a':
$ echo ${array[a]}
valor2
Viu, esperávamos que viesse o 'valor1'; porém o que apareceu foi o 'valor2'; mas por quê? O bash não deu erro. Vamos a explicação:
Primeiro vamos ver como o array está armazenado:
array=([0]="valor2")
Como pode ser, somente há o valor '0', não há nem 'a', muito menos 'b'; para entendermos porque isso ocorreu basta fazer:
$ echo $((a)) 0
O shell sempre converte as letras para o número zero, por isso que tivemos esse problema.
Até que enfim, uma luz de vida inteligente aqui...
Uma contrib. for dummies:
array=(1 2 3 4 5 6 7 8 9 10)
for i in ${array[*]}; do i=$[i-1]; echo ${array[$i]}; done
p.s: workaround = `i=$[i-1]`; kkkkkkkkkkk