Como usar bash arrays em scripts: guia completo
Um bash array é uma estrutura da linguagem Bash que permite agrupar e indexar vários valores, que podem ser strings ou números. Ele ajuda a trabalhar com grandes quantidades de dados de forma mais eficiente, facilitando tarefas de administração de sistemas UNIX, como armazenar a saída de comandos.
Existem dois tipos principais de bash arrays: indexados e associativos. Nos arrays indexados, cada elemento recebe um índice numérico. Já nos arrays associativos, os índices são strings, e você precisa declará-los explicitamente com o builtin declare. Fora isso, a sintaxe para trabalhar com ambos é praticamente a mesma.
Ao usar bash arrays em scripts, é comum precisar modificá-los ou utilizá-los em diferentes operações, como:
- Adicionar uma nova variável a um bash array existente
- Referenciar e imprimir um elemento específico do array
- Remover um elemento de um bash array
- Percorrer todos os itens de um bash array em um loop
- Passar um bash array como argumento para uma função
A seguir, vamos aprofundar o uso de bash arrays em scripts, ver quais operações você pode fazer com eles e conferir alguns exemplos práticos.
Conteúdo
O que é um Bash array?
Um bash array é uma estrutura de dados usada para armazenar informações de forma indexada. Em outras palavras, um bash array funciona como um grande conjunto de variáveis organizadas em sequência.
Diferente dos arrays tradicionais de outras linguagens de programação, um bash array pode guardar diferentes tipos de elementos ao mesmo tempo. Por exemplo, você pode usar um bash array para armazenar tanto strings quanto números.
Importante: o Bash não oferece suporte a arrays multidimensionais, então não é possível criar um array dentro de outro array.
Existem dois tipos de bash arrays: indexados e associativos. Um array indexado usa inteiros (números) como índice, sendo ideal para organizar dados mais simples. Já um array associativo utiliza strings – conjuntos de caracteres e palavras – como chave, sendo ótimo para trabalhar com pares chave-valor.
Além do tipo de índice usado como referência, a forma de declarar arrays indexados e associativos em Bash também muda um pouco.
Como declarar um Bash array?
Declarar um bash array basicamente significa criar o índice e atribuir valores a ele. Você também pode declarar um array de forma explícita usando o builtin declare do shell com a flag -a no início do seu script Bash, embora isso seja opcional em alguns casos.
Por exemplo, para declarar um array indexado, não é obrigatório usar o builtin declare. Já para declarar um array associativo, ele é necessário. Fora essa diferença, você pode declarar ambos os tipos de bash arrays usando praticamente a mesma sintaxe, que vamos explicar a seguir.
Visão geral da sintaxe
A sintaxe básica de um bash array é parecida com esta:
#optional for indexed declare -a IndexedArray Array[subscript1]=element1 Array[subscript2]=element2 Array[subscript2]=element3
O subscript é a referência aos elementos do array – em arrays indexados, ele é um número; em arrays associativos, é uma string. Veja um exemplo de bash array indexado na prática:
#optional for indexed declare -a IndexedArray IndexedArray[0]=car IndexedArray[1]=plane IndexedArray[2]=bike
Já um bash array associativo pode ficar assim:
declare -a IndexedArray AssociativeArray[color]=blue AssociativeArray[type]=car AssociativeArray[topspeed]=200
Você também pode declarar bash arrays de forma mais compacta, em uma única linha, usando índices, como nestes exemplos:
IndexedArray=([0]='car' [1]='plane' [2]='bike')
declare -A Associative Array=( [color]=blue [type]=car [topspeed]=200 )
Repare que, no primeiro exemplo, os elementos do array estão entre aspas. Isso é opcional, mas se torna necessário quando os itens são strings com espaços ou uma string vazia.
No caso específico de arrays indexados, você pode omitir o subscript ao escrever tudo em uma só linha, porque o Bash atribui automaticamente os índices em ordem crescente:
IndexedArray=(car plane bike)
Lembre-se de que a indexação começa em 0. Por isso, no exemplo acima, o elemento car será armazenado no índice 0 do array.
Outra característica interessante de bash arrays é que você não precisa seguir a sequência exata dos índices. Por exemplo, é possível declarar apenas o primeiro e o terceiro elementos e deixar o segundo vazio:
IndexedArray[0]=car IndexedArray[2]=bike
Agora que você já sabe como declarar um array, vamos ver quais operações pode usar para manipular bash arrays na prática.
Como adicionar uma variável a um Bash Array
As variáveis de bash podem ser facilmente adicionadas usando o operador +=. A sintaxe é essa:
ArrayName+=(element-to-add)
Por exemplo, o processo para um array indexado ficaria assim:
IndexedArray=(car plane bike) IndexedArray=(car plane bike)
O array indexado agora tem um novo elemento. Lembre-se que esse método se anexa ao final de um array. Portanto, o elemento motorcycle será adicionado como último elemento.
Para arrays associativos, o processo é bem parecido. A diferença é que é preciso especificar as chaves com todos os elementos.
declare -A AssociativeArray AssociativeArray[color]=blue AssociativeArray+=([tires]=alloy [engine]=gasoline)
Usando o operador do Bash para outra tarefa
Além de adicionar novos itens a um bash array, o operador += também permite concatenar strings no seu script Bash.
Como referenciar e imprimir um elemento Bash array
Os usuários podem referenciar os valores dos bash arrays usando o índice ou a chave do elemento. Para isso, basta criar um array indexado:
IndexedArray=(car plane bike)
Para referenciar a primeira variável de array, utilize a sintaxe abaixo:
${IndexedArray[0]}
Combine a sintaxe com echo e você terá o seguinte resultado:
echo ${IndexedArray[0]}
A saída (output) te mostrará o primeiro elemento. Neste caso, o primeiro elemento é car. A mesma lógica se aplica ao referenciar e imprimir um array associativo:
declare -A AssociativeArray=( [color]=blue [type]=car [topspeed]=200 )
echo ${AssociativeArray[type]}
A saída também será car.
Para imprimir todo o array, usamos @ como um índice. O script completo fica assim:

Você também pode imprimir apenas as chaves de um array. Para isso, basta adicionar um ponto de exclamação antes do nome do array:

Imprimir um elemento de um bash array é muito útil para revisar o script antes de passá-lo para outros comandos ou funções – assim você confirma que está trabalhando com os dados corretos.
Como remover os elementos de Bash arrays
O processo de apagar os elementos de array é parecido com o de referenciá-los. Usamos um indicador ou uma chave combinada com o comando interno unset para remover um elemento de array.
unset ArrayName[index-or-key]
Veja abaixo um exemplo de remoção de um único elemento do array indexado:

Uma lógica parecida se aplica aos arrays associativos:

Para apagar um array inteiro, especifique unset com o nome do array, como mostramos a seguir:

Nada é exibido após tentarmos imprimir os elementos de array porque o comando unset os apagou. Além disso, essa ação também apaga completamente o índice do seu array. Por exemplo, se você der unset em 1 no array abaixo, apenas os índices 0 e 2 continuam existindo:
IndexedArray=([0]='car' [1]='plane' [2]='bike')
Se você usar unset em um índice ou chave que não existe, o bash array não será alterado. Você também não verá nenhuma mensagem de erro, pois a operação é concluída silenciosamente.
Remover itens de bash arrays é algo comum quando você trabalha com dados dinâmicos, como logs. À medida que o script cresce, pode ser interessante apagar elementos que não são mais usados para deixar o array (e o código) mais organizado.
Como Percorrer um Array
Criar loops de bash é um aspecto fundamental para aprender o básico dos comandos bash. Você também pode usar loops com arrays; basta usar a sintaxe abaixo:
for i in "${Array[@]}"; do action; done
Por exemplo, o caso de uso mais comum é a iteração sobre cada item do array:

Você também pode combinar chaves com elementos de array e imprimi-los juntos, como no exemplo abaixo:

Percorrer um bash array em um loop é muito útil para automatizar tarefas que envolvem muitos dados. Por exemplo, você pode renomear vários arquivos de uma vez passando-os para o comando mv ou instalar múltiplos pacotes de uma só vez usando o gerenciador de pacotes do sistema.
Como passar um Bash array para uma função
As funções poupam um tempo considerável na elaboração de scripts. Em vez de escrevermos o mesmo código várias vezes, podemos chamar uma função que já foi escrita. Vamos combinar o loop de iteração mencionado anteriormente e criaremos uma função a partir dele:
function Iteration
{
m=${#IndexedArray[@]}
for (( i=0; i<m; i++ ))
do
echo ${IndexedArray[$i]}
done
}
IndexedArray=(car bike plane)
Iteration ${IndexedArray[@]}
Ao executá-lo em uma linha de comando, você terá o seguinte resultado:

Incorporar funções ao trabalhar com bash arrays em scripts ajuda a lidar com tarefas mais complexas que envolvem muitos dados, como analisar saídas de comandos ou filtrar logs. Geralmente, isso é feito em conjunto com um loop, que percorre os elementos do array para processar cada item passo a passo.
Principais pontos
Bash arrays ajudam você a trabalhar com grandes quantidades de dados de forma muito mais eficiente, algo essencial ao administrar um sistema tipo UNIX, como um VPS Linux. Na prática, bash arrays são muito usados para passar valores para comandos, funções ou loops.
Como o uso de bash arrays com funções, loops e comandos varia bastante conforme a tarefa, vale a pena explorar o recurso com mais calma.
Para aprofundar ainda mais o seu conhecimento sobre bash arrays, experimente criar um script que faça o index e o loop de arquivos para executar uma tarefa automática, como renomeá-los em lote. Você pode fazer isso no seu próprio computador com Linux ou montar um ambiente de testes em um VPS da Hostinger.
