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.

Recomende este artigo nas redes sociais

 

 

Veja a relação completa dos artigos desta coluna