Bash script – Arrays Associativos

Os arrays são de grande utilidade na programação, com eles podemos organizar vários dados que podemos referencia-los por um único nome.

O BASH tem suporte a arrays de uma única dimensão o que realmente para certos fins pode ser pouco, mas é o que realmente temos com BASH. Quase todas as linguagens de programação suportam arrays multi dimensionais.

Um array associativo é uma variável especial, que guarda vários valores com o mesmo nome de variável. Para nos referirmos a um determinado valor utilizamos uma “chave” que referencia um determinado valor no array. Esta “chave” deve ser algo, que nos faça rapidamente perceber o seu valor.

Os arrays são a forma mais segura de guardar em memória vários valores. Também podemos guardar vários valores com variáveis normais, mas seria muito trabalhoso iniciar todas as variáveis que iríamos utilizar num script. E se o script gerar valores dinamicamente é impraticável. Para além de tudo isto o BASH lida muito bem com os arrays, o que vamos ver mais para a frente quando realmente os scripts de exemplo já forem mais complicados.

Neste artigo vou explicar como inicializar arrays associativos.

Inicializando Arrays Associativos

Como referi no artigo sobre os arrays indexados, para podermos inicializar um array associativo é obrigatório declara-lo como tal. Para fazê-lo usamos o comando interno “declare” com a opção “-A“.

declare -A usernames
usernames=([user1]="José Caldeira" [user2]="João Marques" [user3]="Mariana Ferreira")

O comando interno “declare” com a opção “-A” declara o nome “usernames” como sendo um array associativo, onde os seus valores são acedidos através de uma “chave“.

 Podemos declarar e inicializar, de uma só vez o array, desta forma.

declare -A usernames=([user1]="José Caldeira" [user2]="João Marques" [user3]="Mariana Ferreira")

Podemos acrescentar valores aos arrays declarados previamente, sempre que seja necessário, da seguinte forma.

usernames[user4]="Inês Caldeira"

Neste momento o array “usernames” passa a guardar mais um utilizador, que pode ser referenciado pelo “chave” “user4”, que tem guardado o primeiro e ultimo nome deste utilizador.

Para podermos obter o valor que está guardado em cada posição de um array associativo utilizamos a seguinte sintaxe.

${usernames[user4]}

Como podemos apreciar o nome do array fica entre chavetas e a “chave” fica entre parêntesis rectos.  Se quisermos obter o valor guardado em outra posição do array só temos de mudar a chave.

Também é possível  obter todos os valores de um array, existe várias razões para fazermos e iremos ver ao longo dos artigos quando escrever sobre os ciclos em BASH. Para já apenas vamos escrevendo os valores.  Quando queremos obter todos os seus valores a sintaxe é a seguinte:

${usernames[@]}

ou a seguinte

${usernames[*]}

Também é possível  obter todas as chaves de um array associativo, a sintaxe é a seguinte:

${!usernames[@]}

Vamos experimentar estes conceitos com o seguinte script:

#!/bin/bash

# Declarando e inicializando um array associativo
# com três valores
declare -A usernames=([user1]="José Caldeira" [user2]="João Marques" [user3]="Mariana Ferreira")

# Escrever o valor guardado em cada chave do array
echo "O nome completo do utilizador 'user1' é: ${usernames[user1]}"
echo "O nome completo do utilizador 'user2' é: ${usernames[user2]}"
echo "O nome completo do utilizador 'user3' é: ${usernames[user3]}"


# Escrever uma linha vazia
echo

# Declarando o array associativo
declare -A usernames

# Adicionando o utilizador user1 ao array
usernames[user1]="José Caldeira"

# Escrever o valor guardado com a chave user1
echo "O nome completo do utilizador 'user1' é: ${usernames[user1]}"

# Adicionando o utilizador user2 ao array
usernames[user2]="João Marques"

# Escrever o valor guardado com a chave user2
echo "O nome completo do utilizador 'user2' é: ${usernames[user2]}"

# Adicionando o utilizador user3 ao array
usernames[user3]="Mariana Ferreira"

# Escrever o valor guardado com a chave user3
echo "O nome completo do utilizador 'user3' é: ${usernames[user3]}"

# Escrever uma linha vazia
echo

# Escrever todos os valores existente no array
echo "O valores do array são: ${usernames[@]}"
echo "O valores do array são: ${usernames[*]}"

# Escrever uma linha vazia
echo

# Escrever todos as chaves existente no array
echo "O array contem as seguintes chaves: ${!usernames[@]}"

# Escrever uma linha vazia
echo

# Escrever o número de pares chave/valor que existem no array
echo "O número de pares chave/valor é: ${#usernames[@]}"

Corremos o script desta forma:

miguel@LUA:~/Scripts/bash$ ./arrays_associativos_ex_1.sh 
O nome completo do utilizador 'user1' é: José Caldeira
O nome completo do utilizador 'user2' é: João Marques
O nome completo do utilizador 'user3' é: Mariana Ferreira

O nome completo do utilizador 'user1' é: José Caldeira
O nome completo do utilizador 'user2' é: João Marques
O nome completo do utilizador 'user3' é: Mariana Ferreira

O valores do array são: Mariana Ferreira João Marques José Caldeira
O valores do array são: Mariana Ferreira João Marques José Caldeira

O array contem as seguintes chaves: user3 user2 user1

O número de pares chave/valor é: 3

Conclusão

Trabalhar com arrays associativos é importante na elaboração de scripts. Os arrays são a forma mais segura de guardar vários valores agrupados e referenciados apenas por um único nome.

Perceber bem estes conceitos é importante, pois permite-nos ter uma maior compreensão mais tarde quando os scripts forem mais complexos e usarem estes conceitos.

 

Experimentar

Para experimentar os scripts descarregue-os e guarde dentro de uma pasta dentro da sua pasta pessoal. Terá que lhes dar permissão de execução a todos eles. veja este exemplo de como fazer, terá que ajustar para o seu utilizador e a pasta onde guardou os scripts.

miguel@LUA:~$ cd Scripts/bash
miguel@LUA:~/Scripts/bash$ chmod +x *
miguel@LUA:~/Scripts/bash$ ./var_arrays_associativos_ex_1.sh

Duvidas e ideias que queiram discutir sobre BASH podem ser discutidas aqui.

Partilhem, comentem e experimentem!

Artigos Relacionados:

Deixe uma resposta