Um guia para matrizes Bash

Neste guia sobre arrays Bash, você aprenderá como declarar e trabalhar com arrays indexados e associativos no Bash.

No Bash, você pode criar arrays para armazenar uma coleção de elementos. Arrays Bash são coleções unidimensionais. Em linguagens de programação como C e C++, arrays são coleções de elementos do mesmo tipo de dados. No entanto, no Bash, dependendo do caso de uso, você pode armazenar números inteiros e strings no mesmo array.

Neste tutorial, você aprenderá como declarar um array Bash e acessar seus elementos. Em seguida, você aprenderá como percorrer os elementos de uma matriz e anexar elementos a uma matriz. Por fim, você aprenderá sobre arrays associativos no Bash.

Vamos começar!

⚙ Interessado em codificar junto? Aqui estão os pré-requisitos:

Como declarar uma matriz Bash

Nesta seção, você aprenderá a sintaxe para declarar uma matriz Bash e exemplos de código.

Sintaxe da Declaração de Matriz Bash

Você pode declarar uma matriz no Bash usando a seguinte sintaxe:

$ arrayName=(elt1 elt2 ... eltN)

# arrayName is the name of the array
# elt1 through eltN are the N elements in the array

Na sintaxe acima, arrayName denota o nome da matriz que contém N elementos elt1…eltN.

Os elementos de uma matriz são colocados entre os parênteses de abertura e fechamento (). Além disso, observe que os elementos do array são separados por um espaço em branco. Como acontece com qualquer variável Bash, não deve haver espaço em branco antes ou depois do operador de atribuição =.

📑 Na maioria das outras linguagens de programação, você separará os elementos de uma matriz ou coleções semelhantes por vírgulas. Mas no Bash, o espaço em branco é o separador.

No Bash, esses arrays nos quais os elementos são identificados por seu índice são referidos como array indexado.

Declarando Arrays Indexados no Bash

Vamos criar preços, uma matriz de números.

$ prices=(24 27 18 30 15)

Conforme mencionado na sintaxe, os números na matriz de preços são separados por um espaço em branco, entre parênteses, sem espaços antes e depois do operador de atribuição =.

  Como consertar um Mac lento ou sem resposta

No Bash, você pode usar o comando echo para imprimir o valor de uma variável. Usar $variableName imprime o valor de variableName. No entanto, você pode ver que usar o nome do array imprime apenas o primeiro elemento.

$ echo $prices
24

Arrays Bash seguem a indexação zero. Portanto, o primeiro elemento está no índice 0, o segundo elemento está no índice 1 e assim por diante. Você também pode usar indexação negativa; o índice do último elemento da matriz é -1.

O que acontece se você tentar acessar o elemento em um determinado índice e imprimi-lo? Vamos tentar imprimir o elemento no índice 1.

$ echo $prices[1]
24[1]

Por que a saída é 24[1]? 🤔 Isso ocorre porque o Bash substitui $prices por 24, o primeiro elemento da matriz e [1] é impresso como tal.

Para imprimir o elemento em um determinado índice, você pode usar a expansão de parâmetros na forma ${preços[index]}.

$ echo ${prices[1]}
# 27
$ echo ${prices[2]}
# 18

Para imprimir todos os elementos da matriz, você pode especificar @ em vez de um índice específico.

$ echo ${prices[@]}
24 27 18 30 15

Em seguida, vamos criar um array de strings. A execução do seguinte comando cria uma matriz indexada:

$ declare -a fruits

A opção -a cria uma matriz indexada. Agora você pode preencher a matriz, um elemento por vez, declarando o elemento em um índice específico, conforme mostrado abaixo:

$ fruits[0]="cherry"
$ fruits[1]="berry"
$ fruits[2]="apple"
$ fruits[3]="pear"
$ fruits[4]="melon"
$ fruits[5]="orange"

Agora, para imprimir todos os elementos do array, você pode usar ${fruits[@]}.

$ echo ${fruits[@]}
cherry berry apple pear melon orange

Acessar os elementos de uma matriz Bash

Você pode acessar os elementos da matriz das seguintes maneiras:

  • Percorra o array e acesse o elemento diretamente
  • Percorra o conjunto de índices e acesse elementos em um índice específico

Percorra a matriz e os elementos de acesso

Se você codificou em Python, terá usado o loop for usando a seguinte sintaxe:

for elt in some_list:
    print(elt)

Agora vamos escrever o equivalente em Bash do loop for acima.

  Como escolher uma cor personalizada para o seu menu Iniciar

Sabemos que {preços[@]} se expande para todos os elementos na matriz de preços. E ${preços[@]} nos dá os valores de todos os elementos.

O loop for do Bash é semelhante à sintaxe do loop for do Python, mas as instruções no corpo do loop devem ser incluídas entre do e done, conforme mostrado:

$ for price in ${prices[@]}
> do
> echo $price
> done

Como usamos o comando echo e imprimimos o valor da variável preço, obtemos a seguinte saída:

# output
24
27
18
30
15

Acesse os elementos usando o índice da matriz

Outra maneira de percorrer arrays é usando o índice dos elementos. Isso é semelhante à construção do loop for em Python usando a função range():

for i in range(len(some_list)):
    print(i)

Para obter uma lista de índices para percorrer, você pode colocar um ponto de exclamação (!) antes do nome da matriz na expansão do parâmetro. Isso fornecerá a lista de todos os índices válidos para o array, conforme mostrado:

$ echo ${!prices[@]}
0 1 2 3 4

A matriz de preços contém 5 elementos, então o índice começa em 0 e vai até 4.

Em seguida, podemos percorrer a lista de índices e acessar o elemento em cada índice. Para o índice i, ${preços[i]} é o elemento no índice i.

$ for i in ${!prices[@]}
> do
> echo ${prices[i]}
> done

O loop acima imprime todos os elementos na matriz.

# output
24
27
18
30
15

💬 Aqui, após acessar cada elemento, realizamos uma operação simples de impressão de seu valor. Em geral, podemos ter qualquer processamento válido nos elementos.

Anexar elementos a uma matriz Bash

Na matriz de preços, temos cinco elementos (nos índices 0,1,2,3 e 4). Se você quiser adicionar um elemento ao final da matriz no índice 5, faça o seguinte:

$ prices[5]=21

Vemos que 21 foi anexado ao final da matriz de preços.

$ echo ${prices[@]}
24 27 18 30 15 21

No entanto, é mais conveniente acrescentar ao final do array — sem lembrar — o índice do último elemento adicionado ou o número de elementos atualmente no array.

Você pode usar arrayName+=(elements(s)) para anexar um ou mais elementos a um array, conforme mostrado:

$ prices+=(10)

Agora, se imprimirmos a matriz de preços, veremos que 10 foi acrescentado ao final da matriz.

$ echo ${prices[@]}
24 27 18 30 15 21 10

A seguir, vamos aprender como declarar arrays associativos no Bash.

  Kanban vs Scrum: Diferenças

Matrizes associativas no Bash

Se você deseja definir um relacionamento em termos de pares chave-valor, pode usar uma matriz associativa. Você pode declarar um array associativo usando a seguinte sintaxe geral. Observe que usamos a opção -A em vez de -a.

$ declare -A fruits_prices

Você pode adicionar elementos à matriz associativa especificando a chave e o valor correspondente. Aqui, adicionamos os nomes das frutas como chaves e os números da matriz de preços como valores.

$ fruits_prices[cherry]=24
$ fruits_prices[berry]=27
$ fruits_prices[apple]=18
$ fruits_prices[pear]=30
$ fruits_prices[melon]=15
$ fruits_prices[orange]=21

Então, como acessamos os elementos em um array associativo?

Da mesma forma que você procuraria o valor usando a chave correspondente em um dicionário Python, você pode acessar os valores em uma matriz associativa usando as chaves.

$ echo ${fruits_prices[berry]}
# 27

Vemos que ${fruits_prices[@]} expande para os valores e ${!fruits_prices[@]} se expande para as chaves.

$ echo ${fruits_prices[@]}
# Output: 18 27 21 24 30 15
$ echo ${!fruits_prices[@]}
# Output: apple berry orange cherry pear melon

Observação: a ordem dos elementos não é a mesma em que os adicionamos. Isso ocorre porque, ao contrário dos arrays indexados, os arrays associativos não são coleções ordenadas. Em vez disso, eles trabalham na associação entre as chaves e os valores. Portanto, as chaves são para os arrays associativos o que os índices são para os arrays de índices.

Você também pode percorrer o array associativo e acessar as chaves, conforme mostrado:

$ for key in ${!fruits_prices[@]}
> do
> echo $key
> done
# Output
apple
berry
orange
cherry
pear
melon

O loop a seguir mostra como você pode acessar os valores.

$ for value in ${fruits_prices[@]}
> do
> echo $value
> done
# Output
18
27
21
24
30
15

Embora seja recomendado usar arrayName[key]=value, você também pode declará-lo como uma sequência como esta:

declare -A arrayName
arrayName=(key1 value1 key2 value2 ... keyN valueN)

Dessa forma, o Bash infere o primeiro elemento como a primeira chave, o segundo elemento como o primeiro valor e assim por diante.

Resumindo

Espero que agora você entenda como criar e trabalhar com matrizes Bash. Aqui está uma rápida revisão do que você aprendeu.

  • Você pode declarar um array indexado no Bash usando a sintaxe arrayName=(elt1 elt2 elt3 … eltN) ou executar declare -a arrayName e adicionar elementos ao array.
  • Para acessar os elementos, você pode percorrer usando ${arrayName[@]}. Como alternativa, você pode obter a lista de todos os índices válidos usando a expansão de parâmetro ${!arrayName[@]}.
  • Por fim, você também aprendeu como declarar um array associativo para armazenar pares chave-valor no Bash.

Em seguida, confira o tutorial para loops no Bash.