Um guia para matrizes Bash
Publicados: 2022-12-30Neste 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:
- Se você estiver em uma máquina Mac ou Linux, pode abrir seu terminal e codificar junto.
- Se você estiver em uma máquina Windows, instale o Git Bash ou o Windows Subsystem for Linux (WSL2).
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 prices
, uma matriz de números.
$ prices=(24 27 18 30 15)
Conforme mencionado na sintaxe, os números na matriz de
prices
são separados por um espaço em branco, entre parênteses, sem espaços antes e depois do operador de atribuição =.
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âmetro no formato ${prices[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.
Sabemos que {prices[@]}
se expande para todos os elementos na matriz de prices
. E ${prices[@]}
nos dá os valores de todos os elementos.
O loop bash for é semelhante à sintaxe do loop for do Python, mas as instruções no corpo do loop devem ser colocadas 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 price
, 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 prices
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
, ${prices[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 prices
, 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 prices
, 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.
Matrizes associativas no Bash
Se você deseja definir um relacionamento em termos de pares chave-valor, pode usar um array associativo . 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[@]}
se 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 arrays associativos o que os índices são para arrays indexados.
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 executardeclare -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.