Preenchendo array em Shell Script

Algumas maneiras bem legais de se preencher um vetor (array) em Shell Script. Mas antes, alguns esclarecimentos:

Declaração de um vetor

vetor=()
# ou
declare -a vetor

Tamanho ou quantidade de elementos (len) em um vetor

${#vetor[@]} # (hashtag ANTES do nome da variável, mas dentro das chaves)

# Seu retorno é um valor inreito, com o total de elementos do array

Índice dos elementos de um vetor

${!vetor[@]} # (sinal de exclamação ANTES do nome da variável)

# Seu retorno é uma lista de inteiros, começando do zero até a quantidade total de elementos, menos um (se são 5 elementos, a lista retornará 0 1 2 3 4)

Exibir o conteúdo de um vetor

echo "${vetor[@]}"

# Seu retorno é uma lista com todos os elementos do vetor

Mais exemplos de como utilizar variáveis em Shell Script você encontra aqui neste link.

Agora, as formas de se preencher um vetor e dois códigos demonstrativos:

Associação

Essa é a maneira mais simples de se preencher um vetor. Você simplesmente insere os elementos que deseja inserir, com ou sem aspas delimitando-os.

vetor=(carro moto bicicleta moto ônibus)

O comando acima criará um vetor com quatro elementos, na ordem em que foram inseridos:

  1. carro
  2. moto
  3. bicicleta
  4. moto
  5. ônibus

Muito cuidado com o uso das aspas. Se usadas da maneira errada, pode confundir bastante o código.

vetor=("carro moto bicicleta moto ônibus")
# - vetor com UM elemento: carro moto bicicleta moto ônibus

vetor=("carro" "moto bicicleta moto ônibus")
# - vetor com DOIS elementos: carro / moto bicicleta moto ônibus

Adicionando um elemento ao vetor

Se quiser adicionar mais elementos a um vetor, basta usar o sinal de adição antes do sinal de igualdade (o novo elemento ficará no final do vetor):

vetor+=(avião)

Conteúdo do vetor: carro moto bicicleta moto ônibus avião

Para remover um elemento do vetor, basta fazer o seguinte:

vetor=(${vetor[@]/moto})

Agora, o novo conteúdo do vetor será: carro bicicleta ônibus avião

Conteúdo de um arquivo

Podemos preencher um vetor utilizando o conteúdo de um arquivo texto, por exemplo.

vetor=($(< arquivo.txt))
# ou
vetor=(`< arquivo.txt`)

Também utilizando a saída de um comando

vetor=($(ls *.sh))
# ou
vetor=(`ls *.sh`)

Usando o comando interno mapfile (ou readarray) (somente para versões do Bash acima da 4.0):

mapfile -t vetor <<< "(ls *.sh)"
# ou
mapfile -t vetor <<< "`ls *.sh`"
# ou
mapfile -t vetor < <(ls *.sh)

O caso acima é um pouco diferente. Ele utiliza o símbolo menor que. Nesse exemplo, ele trata cada elemento como uma posição do vetor. No primeiro exemplo, com o uso das aspas duplas, toda a linha é tratada como um único elemento. Não confunda! Outra coisa, o parâmetro -t no comando faz com que cada elemento seja inserido SEM o n. Mais informações sobre esse comando aqui.

Para preencher um vetor usando a versão anterior ao Bash 4, tente isso:

vetor=(${vetor[@]} $(ls *.sh))
# ou
vetor=(${vetor[@]} `ls *.sh`)

Exemplos práticos

#!/usr/bin/env bash
mapfile -t vetor < <(cut -d\: -f1 /etc/passwd)

for usuario in "${vetor[@]}"; do
    if [[ "$(whoami)" = "${usuario}" ]]; then
        echo "Sou eu: ${usuario}"
    fi
done

Saída:

Sou eu: p0ng 

O código acima insere em um vetor todos os usuários do arquivo /etc/passwd e compara com o usuário atual.

#!/usr/bin/env bash

vetor=(um dois tres quatro cinco)

for indice in "${!vetor[@]}"; do
    echo "vetor[$indice] = ${vetor[$indice]}"
done

Saída:

vetor[0] = um
vetor[1] = dois
vetor[2] = tres
vetor[3] = quatro
vetor[4] = cinco

Lembrando que, a primeira posição de um vetor é ZERO.

Erros comuns

Um erro muito comum é não escapar asteriscos.

vetor=(um dois tres * quatro)
echo "${vetor[@]}"

Nesse caso, no lugar do asterisco serão exibidos todos os arquivos e pastas onde o script está sendo executado.

Para evitar isso,a solução seria essa:

vetor=(um dois tres \* quatro)
# ou
vetor=(um dois tres "*" quatro)

Por precaução, eu coloco aspas duplas em todos os elementos.

Quer saber mais sobre arrays em Shell Script? Basta acessar esse link (básico) e esse outro link (continuação, um pouco mais avançado).

🙂

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *