De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.


Vetores associativos

Colaboração: Júlio Cezar Neves

Data de Publicação: 12 de outubro de 2017

A partir do Bash 4.0, passou a existir o vetor associativo. Chama-se vetor associativo, aqueles cujos índices são alfabéticos. As regras que valem para os vetores inteiros, valem também para os associativos, porém antes de valorar estes últimos, é obrigatório declará-los.

Exemplos:

$ declare -A Animais        # Obrigatório para vetor associativo
$ Animais[cavalo]=doméstico
$ Animais[zebra]=selvagem
$ Animais[gato]=doméstico
$ Animais[tigre]=selvagem

É impossível gerar todos os elementos de uma só vez, como nos vetores inteiros. Assim sendo, não funciona a sintaxe:

$ Animais =([cavalo]=doméstico [zebra]=selvagem [gato]=doméstico [tigre]=selvagem)
$ echo ${Animais[@]}
doméstico selvagem doméstico selvagem
$ echo ${!Animais[@]}
gato zebra cavalo tigre

Repare que os valores não são ordenados, ficam armazenados na ordem que são criados, diferentemente dos vetores inteiros que ficam em ordem numérica.

Supondo que esse vetor tivesse centenas de elementos, para listar separadamente os domésticos dos selvagens, poderíamos fazer um script assim:

$ cat animal.sh
#!/bin/bash
# Separa animais selvagens e domésticos
declare -A Animais
Animais[cavalo]=doméstico 	# Criando vetor para teste
Animais[zebra]=selvagem 	# Criando vetor para teste
Animais[gato]=doméstico 	# Criando vetor para teste
Animais[tigre]=selvagem 	# Criando vetor para teste
Animais[urso pardo]=selvagem 	# Criando vetor para teste

for Animal in "${!Animais[@]}" # Percorrendo vetor pelo índice
do
 if [[ "${Animais[$Animal]}" == selvagem ]]
 then
 Sel=("${Sel[@]}" "$Animal") # Gerando vetor p/ selvagens
 else
 Dom=("${Dom[@]}" "$Animal") # Gerando vetor p/ domésticos
 fi
done

# Operador condicional, usado para descobrir qual
# vetor tem mais elementos. Veja detalhes na seção
# O interpretador aritmético do Shell

Maior=$[${#Dom[@]}>${#Sel[@]}?${#Dom[@]}:${#Sel[@]}]

clear
tput bold; printf "%-15s%-15s\n" Domésticos Selvagens; tput sgr0

for ((i=0; i<$Maior; i++))
{
 tput cup $[1+i] 0; echo ${Dom[i]}
 tput cup $[1+i] 14; echo ${Sel[i]}
}

Gostaria de chamar a atenção para um detalhe: neste script me referi a um elemento de vetor associativo empregando ${Animais[$Animal]} ao passo que me referi a um elemento de um vetor inteiro usando ${Sel[i]}. Ou seja, quando usamos uma variável como índice de um vetor inteiro, não precisamos prefixá-la com um cifrão ($), ao passo que no vetor associativo, o cifrão ($) é obrigatório.

Sobre o autor

Júlio Cézar Neves

O 4º UNIX do mundo nasceu na Cidade Maravilhosa, mais precisamente na Cobra Computadores, onde à época trabalhava o Julio. Foi paixão à 1ª vista! Desde então, (1980) atua nessa área como especialista em Sistemas Operacionais e linguagens de programação. E foi por essa afinidade que quando surgiu o Linux foi um dos primeiros a estudá-lo com profundidade e adotá-lo como Sistema Operacional e filosofia de vida. É autor dos livros Programação Shell Linux, 11ª edição e Bombando o Shell.

Adicionar comentário

* Campos obrigatórios
5000
Powered by Commentics

Comentários

Nenhum comentário ainda. Seja o primeiro!


Veja a relação completa dos artigos de Júlio Cezar Neves