você está aqui: Home → Colunistas → Cantinho do Shell
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.