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.
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.
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. |
This policy contains information about your privacy. By posting, you are declaring that you understand this policy:
This policy is subject to change at any time and without notice.
These terms and conditions contain rules about posting comments. By submitting a comment, you are declaring that you agree with these rules:
Failure to comply with these rules may result in being banned from submitting further comments.
These terms and conditions are subject to change at any time and without notice.
Comentários