você está aqui: Home  → Colunistas  →  Cantinho do Shell

 

Vetores associativos

Por Júlio Cezar Neves

Data de Publicação: 20 de Janeiro de 2010

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.

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 desta coluna