Neste guia abrangente sobre arrays no Bash, você explorará a fundo como declarar e manipular arrays indexados e associativos, elementos cruciais para a programação em shell.
O Bash permite a criação de arrays, que atuam como contêineres para armazenar coleções de elementos. É importante notar que, no Bash, arrays são estruturas unidimensionais. Em linguagens como C e C++, arrays são coleções homogêneas, ou seja, todos os elementos pertencem ao mesmo tipo de dado. Já no Bash, essa restrição não se aplica, sendo possível armazenar tanto números inteiros quanto strings no mesmo array, conforme a necessidade.
Este tutorial o guiará através do processo de declaração de um array no Bash, mostrando como acessar seus elementos. Você aprenderá a iterar sobre os elementos de um array e a adicionar novos elementos. Por fim, abordaremos arrays associativos, uma ferramenta poderosa para o manuseio de dados.
Vamos iniciar nossa jornada no mundo dos arrays Bash!
⚙ Quer programar junto? Aqui está o que você precisa:
Declaração de um Array no Bash
Nesta seção, você aprenderá a sintaxe para declarar um array no Bash, acompanhada de exemplos práticos.
Sintaxe para Declarar Arrays no Bash
A declaração de um array no Bash segue a seguinte sintaxe:
$ nomeDoArray=(elemento1 elemento2 ... elementoN) # nomeDoArray é o nome do seu array # elemento1 até elementoN são os N elementos que compõem o array
Na sintaxe acima, `nomeDoArray` representa o nome do array, que armazenará os N elementos `elemento1` até `elementoN`.
Os elementos do array são alocados dentro de parênteses `()`, separados por espaços em branco. Importante: assim como em outras declarações de variáveis no Bash, não pode haver espaços em branco antes ou depois do operador de atribuição `=`.
📑 Em várias outras linguagens, como Python ou JavaScript, os elementos de arrays e coleções similares são separados por vírgulas. No Bash, no entanto, o separador padrão é o espaço em branco.
Arrays no Bash onde os elementos são acessados por meio de um índice numérico são chamados de arrays indexados.
Exemplo de Declaração de Arrays Indexados no Bash
Vamos criar um array chamado `preços`, que armazenará uma sequência de valores numéricos:
$ prices=(24 27 18 30 15)
Como visto na sintaxe, os números dentro do array `preços` são separados por espaços e delimitados por parênteses, sem espaços antes ou depois do sinal de igual (=).
No Bash, o comando `echo` é usado para imprimir o valor de uma variável. A sintaxe `$nomeDaVariável` retorna o valor armazenado em `nomeDaVariável`. No entanto, ao usar o nome do array sem um índice específico, apenas o primeiro elemento será impresso.
$ echo $prices 24
Arrays no Bash são indexados a partir de zero. Assim, o primeiro elemento ocupa o índice 0, o segundo o índice 1, e assim sucessivamente. Índices negativos também são válidos: o último elemento do array possui índice -1.
O que acontece se tentarmos acessar um elemento em um índice específico e imprimi-lo? Vamos tentar imprimir o elemento no índice 1.
$ echo $prices[1] 24[1]
Por que a saída é `24[1]`? 🤔 Isso acontece porque o Bash substitui `$prices` por `24`, o primeiro elemento do array, e `[1]` é impresso como texto.
Para acessar e imprimir corretamente o elemento em um índice específico, utilize a expansão de parâmetros com a sintaxe `${preços[índice]}`.
$ echo ${prices[1]}
# 27
$ echo ${prices[2]}
# 18
Para imprimir todos os elementos do array, use `@` em vez de um índice específico.
$ echo ${prices[@]}
24 27 18 30 15
Agora, vamos criar um array de strings. O comando abaixo cria um array indexado:
$ declare -a fruits
A opção `-a` indica que estamos criando um array indexado. Agora, podemos adicionar elementos ao array, um por vez, especificando o elemento em um índice particular, como abaixo:
$ fruits[0]="cherry" $ fruits[1]="berry" $ fruits[2]="apple" $ fruits[3]="pear" $ fruits[4]="melon" $ fruits[5]="orange"
Para imprimir todos os elementos do array, utilize `${fruits[@]}`.
$ echo ${fruits[@]}
cherry berry apple pear melon orange
Acesso aos Elementos de um Array no Bash
Há duas maneiras principais de acessar os elementos de um array no Bash:
- Iterando diretamente sobre os elementos do array.
- Acessando os elementos através de seus índices.
Iterando Diretamente Sobre os Elementos do Array
Se você já programou em Python, provavelmente já utilizou um loop `for` com a seguinte estrutura:
for elemento in alguma_lista:
print(elemento)
Agora, vamos criar o equivalente em Bash para o loop acima.
Já sabemos que `${preços[@]}` retorna todos os elementos contidos no array `preços`.
O loop `for` no Bash é similar à sintaxe do loop `for` em Python, mas os comandos do corpo do loop devem ser delimitados por `do` e `done`, como mostrado:
$ for price in ${prices[@]}
> do
> echo $price
> done
O resultado da execução do código acima, imprimindo o valor da variável `price`, é:
# saída 24 27 18 30 15
Acessando Elementos Através de Seus Índices
Outra maneira de iterar sobre arrays é utilizar os índices dos elementos. Esta abordagem é similar ao uso da função `range()` no loop `for` em Python:
for i in range(len(alguma_lista)):
print(i)
Para obter uma lista de índices para iterar, inclua um ponto de exclamação `!` antes do nome do array na expansão de parâmetros. Isso retornará a lista de todos os índices válidos para o array, como abaixo:
$ echo ${!prices[@]}
0 1 2 3 4
O array `preços` contém 5 elementos, portanto, os índices variam de 0 a 4.
Podemos então iterar sobre a lista de índices e acessar cada elemento. Para o índice `i`, `${preços[i]}` representa o elemento no índice `i`.
$ for i in ${!prices[@]}
> do
> echo ${prices[i]}
> done
O loop acima imprime todos os elementos do array.
# saída 24 27 18 30 15
💬 Aqui, após acessar cada elemento, executamos uma operação simples, que foi imprimir o seu valor. Contudo, poderíamos executar qualquer processamento válido sobre os elementos.
Adicionando Elementos a um Array no Bash
O array `preços` possui cinco elementos, localizados nos índices 0, 1, 2, 3 e 4. Se você quiser adicionar um novo elemento ao final do array, no índice 5, proceda da seguinte forma:
$ prices[5]=21
Podemos verificar que o valor `21` foi adicionado ao final do array `preços`.
$ echo ${prices[@]}
24 27 18 30 15 21
No entanto, é mais eficiente adicionar ao final do array sem ter que saber o índice do último elemento ou o número de elementos no array.
Você pode usar a sintaxe `nomeDoArray+=(elementos(s))` para adicionar um ou mais elementos a um array, como exemplificado:
$ prices+=(10)
Ao imprimir o array `preços` novamente, confirmamos que o valor `10` foi adicionado ao final.
$ echo ${prices[@]}
24 27 18 30 15 21 10
A seguir, vamos explorar como declarar arrays associativos no Bash.
Arrays Associativos no Bash
Se você precisa definir relações do tipo chave-valor, arrays associativos são a ferramenta ideal. Para declarar um array associativo, utilize a seguinte sintaxe, observando o uso da opção `-A` em vez de `-a`:
$ declare -A fruits_prices
Você pode adicionar elementos ao array associativo especificando a chave e o valor correspondente. No exemplo abaixo, os nomes das frutas são as chaves e os números do array de preços são os 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
Como acessar os elementos de um array associativo?
Da mesma forma que se procura um valor em um dicionário Python usando a chave correspondente, você pode acessar os valores em um array associativo usando as chaves.
$ echo ${fruits_prices[berry]}
# 27
É importante notar que `${fruits_prices[@]}` retorna os valores, enquanto `${!fruits_prices[@]}` retorna as chaves.
$ echo ${fruits_prices[@]}
# Saída: 18 27 21 24 30 15
$ echo ${!fruits_prices[@]}
# Saída: apple berry orange cherry pear melon
Observação: A ordem dos elementos não é a mesma em que foram adicionados. Isso ocorre porque, ao contrário dos arrays indexados, os arrays associativos não são coleções ordenadas. Em vez disso, trabalham na associação entre chaves e valores. Assim, as chaves nos arrays associativos desempenham a mesma função que os índices nos arrays indexados.
Você pode iterar sobre um array associativo e acessar suas chaves, conforme abaixo:
$ for key in ${!fruits_prices[@]}
> do
> echo $key
> done
# Saída apple berry orange cherry pear melon
O loop abaixo mostra como acessar os valores.
$ for value in ${fruits_prices[@]}
> do
> echo $value
> done
# Saída 18 27 21 24 30 15
Embora a forma recomendada seja `nomeDoArray[chave]=valor`, você também pode declarar um array associativo como uma sequência de pares chave-valor:
declare -A nomeDoArray nomeDoArray=(chave1 valor1 chave2 valor2 ... chaveN valorN)
Neste formato, o Bash interpreta o primeiro elemento como a primeira chave, o segundo elemento como o primeiro valor e assim por diante.
Concluindo
Esperamos que agora você tenha uma compreensão sólida de como criar e trabalhar com arrays no Bash. Aqui está um breve resumo do que aprendemos.
- Você pode declarar um array indexado no Bash usando a sintaxe `nomeDoArray=(elemento1 elemento2 elemento3 … elementoN)` ou usando `declare -a nomeDoArray` e adicionando elementos individualmente.
- Para acessar os elementos, você pode iterar sobre o array usando `${nomeDoArray[@]}`. Alternativamente, você pode obter a lista de todos os índices válidos utilizando a expansão de parâmetro `${!nomeDoArray[@]}`.
- Por fim, você também aprendeu a declarar um array associativo para armazenar pares chave-valor no Bash.
Em seguida, explore nosso tutorial sobre loops no Bash.