Os dicionários Bash fornecem mapas hash e matrizes associativas em scripts de shell do Linux. Mostraremos como usar essas estruturas de dados poderosas e úteis em seus próprios scripts de shell do Linux.
Índice
Uma rosa por qualquer outro nome
O nome formal dos dicionários é matrizes associativas. Eles também são chamados de tabelas de hash e mapas de hash. Eles são uma estrutura de dados que funciona de forma semelhante a uma matriz regular, mas com uma diferença significativa.Uma matriz é uma coleção de valores de dados mantidos em uma estrutura de dados. Para acessar qualquer um dos valores de dados, que são conhecidos como elementos da matriz, você precisa saber sua posição na matriz. A posição de um elemento da matriz na matriz é conhecida como seu índice, portanto, esses tipos de matrizes são conhecidos como matrizes indexadas. Eles são o tipo de matriz mais comumente usado.
No entanto, eles têm uma desvantagem. Como você acessa um elemento de array se não sabe sua posição na lista? Você precisa percorrer todos os elementos do array, testando para ver se o valor naquele local é aquele que você está procurando.
Matrizes associativas superam esse problema. Eles não usam números inteiros para identificar exclusivamente os elementos da matriz. Eles usam palavras exclusivas conhecidas como palavras-chave. Você pode recuperar o valor de um elemento da matriz usando sua palavra-chave, independentemente de onde ele esteja posicionado na matriz. Com uma matriz indexada, os números inteiros que representam as posições dentro da matriz estão em ordem crescente. As palavras-chave em uma matriz associativa podem estar em qualquer ordem.
Você pode pesquisar um valor em uma matriz associativa pesquisando com sua palavra-chave. Pesquisar uma palavra e recuperar seu valor associado simula pesquisar uma palavra em um dicionário e encontrar seu significado. É por isso que as matrizes associativas são conhecidas como dicionários.
Bash 4.0 ou superior
Matrizes associativas são suportadas no shell Bash versão 4.0 ou superior. Se você estiver usando uma distribuição Linux atual, não terá problemas. Para verificar sua versão do Bash, use este comando:
bash --version
A máquina usada para pesquisar este artigo tem o Bash 5.1.4 instalado, então estamos prontos.
Princípios básicos
Para criar um array associativo na linha de comando do terminal ou em um script, usamos o comando Bash declare. A -A
opção (associativa) diz ao Bash que esta será uma matriz associativa e não uma matriz indexada.
declare -A acrônimos
Isso cria uma matriz associativa chamada “acrônimos”.
Para colocar alguns dados em nosso array, precisamos fornecer palavras-chave e valores. Podemos fazer isso usando este formato:
nome-matriz [chave] = Valor
Vamos adicionar alguns elementos do array:
acrônimos [ACK] = Agradecimento
acrônimos [BGP] = "Protocolo de gateway de fronteira"
acrônimos [CIDR] = "Roteamento entre domínios sem classes"
acrônimos [DHCP] = "Protocolo de configuração de host dinâmico"
acrônimos [EOF] = "Fim do quadro"
Esses comandos definem cinco elementos do array. Observe que os valores são colocados entre aspas se houver espaços no valor. Nossas palavras-chave foram inseridas em ordem alfabética, mas podem ser inseridas na ordem que você desejar. As palavras-chave devem ser exclusivas. Se você tentar criar duas entradas com a mesma palavra-chave, o segundo valor inserido substituirá o primeiro. Você ainda terá apenas uma entrada com essa palavra-chave e ela será associada ao segundo valor adicionado.
Para recuperar valores da matriz, usamos comandos neste formato:
$ {nome-matriz [chave]}
Podemos usar echo para enviar a saída para a janela do terminal:
echo $ {acrônimos [ACK]}
echo $ {acrônimos [DHCP]}
Usando Loops
Os arrays podem ser usados em loops muito bem. Matrizes associativas não são exceção. Os loops fornecem maneiras eficientes de invocar uma sequência de ações sem seções repetitivas de código. Antes de examinarmos os loops, há uma maneira eficiente de declarar matrizes.
Criamos os arrays usando o declare
comando (a mesma -A
opção de antes), mas fornecemos as palavras-chave e os valores como uma lista na linha de comando.
declarar países -A = ([ALB] = Albânia [BHR] = Bahrein [CMR] = Camarões [DNK] = Dinamarca [EGY] = Egito)
O nome da matriz é “países” e está conectado à lista de valores por um sinal de igual ” =
.” A lista de valores é colocada entre parênteses “ ()
” e cada palavra-chave é colocada entre colchetes “ []
“. Observe que não há vírgulas separando os valores. Se você tiver uma string de valor que contenha espaços, será necessário colocá-la entre aspas.
Para fazer uma matriz associativa retornar uma palavra-chave em vez do valor, adicione um ponto de exclamação “ !
” na frente do nome da matriz. O símbolo @
arroba “ ” pode ser usado como um curinga, significando todos os elementos da matriz.
Este for
loop listará todas as palavras-chave:
para chave em "$ {! países [@]}"; faça echo $ key; feito
Observe que as palavras-chave não estão necessariamente listadas na ordem em que foram criadas, mas isso não importa. As matrizes associativas não dependem de um índice ordenado.
Também podemos usar a expansão do parâmetro para listar todas as palavras-chave. Eles serão listados em uma linha, não um por linha.
echo "$ {! países [@]}"
echo "$ {! acrônimos [@]}"
Podemos aumentar nosso for
loop para imprimir as palavras-chave e os valores ao mesmo tempo.
para digitar "$ {! acrônimos [@]}"; faça echo "$ key - $ {acronyms [$ key]}"; feito
Se quisermos saber quantos elementos existem nas matrizes, podemos usar um hash “#” na frente do nome da matriz em vez de um ponto de exclamação.
echo "$ {! países [@]}"
echo "$ {! acrônimos [@]}"
Verificando se existe um elemento Array
Se você pesquisar uma palavra-chave, mas não houver nenhum elemento de matriz, o valor de retorno será uma string vazia. Às vezes, é útil ter um indicador diferente para a presença ou ausência de um elemento da matriz.
Podemos verificar a presença de um elemento do array usando o +_
operador “ ”. Observe que isso vem depois da palavra-chave, não na frente do nome do array como os operadores anteriores que vimos.
if [$ {acrônimos [EOF] + _}]; então echo "Found"; else echo "Não encontrado"; fi
if [$ {acrônimos [FTP] + _}]; então echo "Found"; else echo "Não encontrado"; fi
O elemento do array com a palavra-chave “EOF” é encontrado no array, mas o elemento do array com a palavra-chave “FTP” não é.
Adicionando Elementos de Matriz
Adicionar novos elementos a uma matriz associativa é fácil. Ao contrário de algumas linguagens de programação, você não precisa definir o tamanho do seu array ao declará-lo. Você pode continuar adicionando novos elementos sem atingir um limite superior predefinido.
Para adicionar um novo elemento ao array, usamos o +=
operador “ ”.
países + = ([FJI] = Fiji)
echo "$ (# países [@]}"
echo $ {countries [FJI]}
O número de elementos na matriz agora é seis e a pesquisa pela nova palavra-chave localiza o elemento da matriz e retorna seu valor.
Removendo Array Elements e Arrays
O unset
comando é usado para remover elementos da matriz. Se a palavra-chave contiver espaços, coloque-a entre aspas.
siglas não definidas [EOF]
if [$ {acrônimos [EOF] + _}]; então echo "Found"; else echo "Não encontrado"; fi
Para remover a matriz inteira, use unset
com o nome da matriz.
países não definidos
Usando variáveis com matrizes
Usar variáveis com matrizes associativas é direto. Neste exemplo, definiremos uma chave variável para a string “EOF”. Usaremos a variável quando adicionarmos um novo elemento de array ao array. Na verdade, estamos substituindo o elemento da matriz que excluímos anteriormente.
Recuperaremos o novo elemento da matriz chamando-o com a nova palavra-chave e também, usando a variável. Se a palavra-chave contiver espaços, você precisará colocar o nome da variável entre aspas.
chave = EOF
acrônimos [$ key] = "Fim do quadro"
echo $ {acrônimos [EOF]}
echo $ {acrônimos [$ key]}
Seja criativo
Nossos exemplos foram coleções de informações em que cada elemento do array é independente de todos os outros, como um dicionário. Cada um é uma definição única. Mas as matrizes associativas podem facilmente conter uma variedade de peças de informação, todas relacionadas a uma coisa, como as especificações de diferentes peças de hardware de computador:
declarar -A especificação
especificação [CPU] = "Dual Core AMD Ryzen 5 3600"
especificação [velocidade] = "3600 MHz"
especificação [Kernel] = "5.11.0-17-x86_64 genérico"
especificação [Mem] = "1978,5 MiB"
especificação [armazenamento] = "32 GiB"
especificação [Shell] = "Bash"
echo $ {especificação [CPU]}
Escrever com eficiência em uma linguagem significa conhecer os mecanismos e estruturas que ela oferece e selecionar o mais adequado para o problema que você está tentando resolver. As matrizes associativas oferecem uma maneira fácil de usar para armazenar dados que você pode pesquisar por nome, como um dicionário.