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:
- carro
- moto
- bicicleta
- moto
- ô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).
🙂