Hoje o assunto é sobre como criar
arrays (também chamados de vetores) uni e multidimensionais, bem como
hashes em
BASH Script.
Costumeiramente, usa-se apenas array unidimensional e com índice numérico, que é o mais difundido.
Será apresentada umas das formas de usar uma estrutura multidimensional e também a possibilidade de criação de variáveis hash, tal como em Perl.
Eis aqui um exemplo de um código criador de uma estrutura unidimensional com elementos em índices de 0 a 3:
for ((i=0;i<=3;i++))
do
array[$i]=$RANDOM
done
Para mostrar os números randômicos atribuídos aos elementos do array, usa-se o código:
for ((i=0;i<=3;i++))
do
echo 'array['$i']' = ${array[$i]}
done
Para ampliar os poderes da variável que se pretende usar como array multidimensional, usa-se o comando:
declare -A [name[=value] ...]
De acordo com o comando
help declare:
-A to make NAMEs associative arrays (if supported) - criar arrays associativos se suportado (tradução livre).
Ou seja, arrays com índices numéricos ou de strings.
E agora, um exemplo de código de como usar um array de duas dimensões:
declare -A matriz
for ((i=0;i<=3;i++))
do
for ((j=0;j<=4;j++))
do
matriz[$i,$j]=$RANDOM
done
done
Para mostrar os números randômicos atribuídos aos elementos do array multidimensional, pode-se usar:
for ((i=0;i<=3;i++))
do
for ((j=0;j<=4;j++))
do
echo 'matriz['$i','$j']' = ${matriz[$i,$j]}
done
done
A sintaxe desta variável matriz é a da colocação de índices numéricos separados por vírgulas dentro dos colchetes da declaração da variável. Com isto, podem ser criados arrays com vários índices. Usa uma espécie associativa de índice por causa da vírgula separadora.
Na verdade são hashes, porque a vírgula transforma o índice numa string. É que a sintaxe de índices i,j como [i,j] é legível por humanos de um modo que é interpretado como dois índices numéricos. Tanto é que elementos de arrays com índices [0], [00], [1,1] e [01,01], são todos distintos.
Portanto, em scripts a sintaxe com a string [$i,$j] no único índice comporta-se como dois índices. Ainda há a possibilidade de que cada variável seja uma string, ou que ela possua como valor dados combinados como índices. Afinal, de qualquer modo são strings sendo lidas como índices separados por vírgulas.
Sendo, então, que a declaração da variável matriz poderia ser algo como matriz[2,3,5,7,11,13], de modo que não há limitações de dimensão (desde que haja memória suficiente na máquina, naturalmente), sendo bem flexível o uso na confecção de scripts. Inclusive a declaração não limita a dimensão, ficando a cargo do programador.
O uso de @ ou * no índice da variável, que apresenta os valores de todos os elementos, resultará na exibição dos valores contidos em toda sua estrutura, mas com uma ordem própria, podendo ser sem definição lógica pelos índices ou ordem de inclusão.
Continuando, agora falar-se-á de hashes. Hashes aqui são tidos como arrays de índices alfanuméricos ou strings, que são associativos puros. Como são feitos em linguagens como Perl e Python (em Python, a nomenclatura chama-os de dicionários).
C não possui variável tipo hash em sua implementação.
Para ser criado um hash, basta usar o mesmo comando que se usa para a criação de vetores multidimensionais. Exemplificando:
declare -A meuhash
Agora, podem ser feitos hashes com o nome de estrutura sendo "meuhash".
Podendo ser escrito neste hash variáveis tendo índice de string:
meuhash['ano']=2016
meuhash['mes']=08
meuhash['dia']=28
Aspas simples ou duplas são opcionais, mesmo se no índice estiverem espaços em branco.
Para exibir os valores deste hash, pode-se usar o seguinte código:
for i in dia mes ano
do
echo 'meuhash['$i']' = ${meuhash[$i]}
done
Não há limite para as dimensões de um hash, sendo possível misturar índice de string com índice numérico.
Usar @ ou * também faz com que os valores do hash apareçam numa ordem própria, sem qualquer definição ordenada pelos índices.
Conclusão
Esperou-se aqui explicar e demonstrar com este breve artigo, que é muito simples usar variáveis do tipo array com várias dimensões e também do tipo hash, através do comando
declare.
Fontes:
Bem, é isto.
Até mais.