Domine o Loop For em Bash: 10 Exemplos Práticos!

Explorando o Loop For em Bash: Um Guia Detalhado

O loop `for` é um elemento fundamental em qualquer linguagem de programação, proporcionando a capacidade de iterar sobre um conjunto de itens. Essencialmente, ele permite que os programas percorram coleções de dados, executando ações repetidamente.

Imagine que você precisa analisar uma lista, ou um array, que contém ‘n’ elementos. O loop `for` é a ferramenta ideal para essa tarefa. Considere, por exemplo, uma sequência de cores:

1. Violeta 2. Índigo 3. Azul 4. Verde

Para realizar qualquer operação sobre esses itens, ou simplesmente navegar por eles, o loop `for` é indispensável.

Sintaxe do Loop For em Bash

Dentro de um script Bash, a estrutura do loop `for` segue o seguinte padrão:

 #!/bin/bash
 
 for VAR in 1 2 3 4 5.....N
 do
   AÇÃO 1
   AÇÃO 2
   .....
 done
 

A simplicidade do loop `for` em Bash é evidente. A linha `#!/bin/bash` declara que o código é um script Bash. `VAR` representa a variável temporária que armazena cada elemento durante a iteração. `N` define o número máximo de iterações. As palavras-chave `do` e `done` marcam o início e o fim do loop, respectivamente. As `AÇÕES` são os comandos que são executados em cada iteração.

O loop `for` em Bash é extremamente versátil, operando com diferentes tipos de dados como listas, strings, números e arrays. Este artigo demonstrará alguns exemplos práticos do seu uso.

Você pode testar esses exemplos diretamente no terminal Bash ou salvá-los em um arquivo com a extensão `.sh` e executá-lo com o comando `bash nome_do_arquivo.sh`.

Lendo Listas Estáticas

Vamos considerar uma lista de cores do arco-íris: rainbowColorList = Violeta, Índigo, Azul, Verde, Amarelo, Laranja, Vermelho.

Podemos facilmente exibir essa lista utilizando um loop `for` em Bash:

 #!/bin/sh
 
 # Define a lista
 rainbowColorList=Violeta,Índigo,Azul,Verde,Amarelo,Laranja,Vermelho
 
 # Utiliza o padrão de separador por vírgula //,/
 for cores in ${rainbowColorList//,/ }
 do
   echo $cores
 done
 

A saída apresentará cada cor em uma linha separada.

 #Saída
 Violeta
 Índigo
 Azul
 Verde
 Amarelo
 Laranja
 Vermelho
 

Lendo um Array

A declaração de um array em Bash tem uma sintaxe ligeiramente diferente, com cada elemento (string) envolvido por parênteses:

 rainbowArray=("Violeta" "Índigo" "Azul" "Verde" "Amarelo" "Laranja" "Vermelho")
 
 for cores in "${rainbowArray[@]}"; do
     echo "Eu gosto de $cores"
 done
 

O caractere `@` é usado para iterar através de todos os elementos do array.

 #Saída
 Eu gosto de Violeta
 Eu gosto de Índigo
 Eu gosto de Azul
 Eu gosto de Verde
 Eu gosto de Amarelo
 Eu gosto de Laranja
 Eu gosto de Vermelho
 

Também podemos utilizar o loop `for` para exibir os índices e os elementos do array simultaneamente:

 #Impressão com índice
 rainbowArray=("Violeta" "Índigo" "Azul" "Verde" "Amarelo" "Laranja" "Vermelho")
 
 for i in "${!rainbowArray[@]}";
 do
   echo "Cor no índice " $i " : " "${rainbowArray[$i]}"
   i=$((i+1));
 done
 
 #Saída
 Cor no índice 0 : Violeta
 Cor no índice 1 : Índigo
 Cor no índice 2 : Azul
 Cor no índice 3 : Verde
 Cor no índice 4 : Amarelo
 Cor no índice 5 : Laranja
 Cor no índice 6 : Vermelho
 

Observe o uso de `!` para obter o índice de cada elemento dentro do loop.

Iterando um Intervalo de Números

O loop `for` em Bash permite iterar sobre um intervalo numérico de forma simplificada:

 #Iterando sobre um intervalo de números
 echo "Contagem regressiva iniciada..."
 for N in {10..0}
 do
    echo "$N"
 done
 

O operador `..` define o intervalo de números.

 #Saída
 10
 9
 8
 7
 6
 5
 4
 3
 2
 1
 0
 

É possível também definir um passo na contagem, especificando um valor para pular:

No exemplo abaixo, estamos pulando a contagem de 3 em 3:

 #Iterando com pulo na contagem
 echo "Contagem regressiva iniciada..."
 for N in {30..0..3}
 do
    echo "$N"
 done
 

O programa inicia com 30, conta até 0, e o último parâmetro `3` define o valor de pulo na contagem.

 #Saída
 30
 27
 24
 21
 18
 15
 12
 9
 6
 3
 0
 

Strings e Caracteres

O loop `for` em Bash também oferece capacidades interessantes de manipulação de strings.

Por exemplo, é possível extrair cada caractere de uma string utilizando o operador `seq`:

 #Lê caracteres de uma string
 myword="bemvindo"
 for i in $(seq 1 ${#myword})
 do
  echo "${myword:i-1:1}"
 done
 

Note que o comando `seq` inicia com 1 para obter o primeiro caractere.

 #Saída
 b
 e
 m
 v
 i
 n
 d
 o
 

Também podemos imprimir cada palavra de uma frase, uma por linha:

 #Lê cada palavra de uma frase
 mysentence="Bem-vindo ao etechpt.com. Um hub completo para todos os entusiastas de tecnologia"
 for word in $mysentence; do
     echo $word
 done
 
 #Saída
 Bem-vindo
 ao
 etechpt.com.
 Um
 hub
 completo
 para
 todos
 os
 entusiastas
 de
 tecnologia
 

Expressões

Assim como em outras linguagens de programação, é possível inserir expressões dentro do loop `for` em Bash:

 for (( var=10; var>=0; var-- ))
 do
  echo "Contagem regressiva...$var"
 done
 
 #Saída
 Contagem regressiva...10
 Contagem regressiva...9
 Contagem regressiva...8
 Contagem regressiva...7
 Contagem regressiva...6
 Contagem regressiva...5
 Contagem regressiva...4
 Contagem regressiva...3
 Contagem regressiva...2
 Contagem regressiva...1
 Contagem regressiva...0
 

Lendo Argumentos da Linha de Comando

Para ler argumentos fornecidos na linha de comando, utilizamos o comando `read`. No exemplo a seguir, vamos obter alguns números do usuário e calcular a soma, utilizando o loop `for`. A variável `total` armazenará a soma intermediária e final dos números.

 read -a array -p "Insira os números que você deseja somar:"
 total=0
 for i in ${array[@]}; do
  let total+=$i
 done
 echo "A soma dos números é: $total"
 

A saída será:

 #Saída
 Insira os números que você deseja somar: 3 4 66
 A soma dos números é: 73
 

Encontrando Números Pares e Ímpares

Para identificar números pares e ímpares em um intervalo, podemos usar a estrutura condicional `if` dentro do loop `for`. Dividindo o número por 2, se o resto for 0, o número será considerado par; caso contrário, ímpar.

 #Declara as listas onde os números pares e ímpares serão classificados e armazenados
 evennum=""
 oddnum=""
 for (( i=1; i<=10; i++ ))
 do
  remainder=$(( $i % 2 ))
  if [ $remainder -eq 0 ]; then
  evennum="$evennum $i "
  else
  oddnum="$oddnum $i "
  fi
 done
 echo "Números pares são: "$evennum
 echo "Números ímpares são: "$oddnum
 

Observe que definimos o intervalo como 10 no exemplo. Você pode modificar esse número para obter números pares e ímpares em qualquer intervalo. Também é possível usar o comando `read` para obter o número do usuário, como visto na seção anterior.

 #Saída
 Números pares são: 2 4 6 8 10
 Números ímpares são: 1 3 5 7 9
 

Loop Infinito

Um loop infinito é um loop que não se encerra, necessitando ser interrompido manualmente com `Ctrl+C`. Em Bash, é fácil criar um loop infinito usando o operador `;;` dentro do loop `for`:

 for (( ; ; ))
 do
  echo "Bem-vindo ao etechpt.com"
 done
 
 #Saída
 Bem-vindo ao etechpt.com
 Bem-vindo ao etechpt.com
 Bem-vindo ao etechpt.com
 Bem-vindo ao etechpt.com
 Bem-vindo ao etechpt.com
 Bem-vindo ao etechpt.com
 Bem-vindo ao etechpt.com
 Bem-vindo ao etechpt.com
 Bem-vindo ao etechpt.com
 Bem-vindo ao etechpt.com
 ^C
 $
 

Comando Break

O comando `break` é utilizado para interromper a execução do loop quando uma condição `if` é satisfeita.

 for cor in Violeta Índigo Azul Verde Amarelo Laranja Vermelho
 do
  if [[ "$cor" == 'Verde' ]]; then
  break
  fi
  echo "Procurando por Verde, a cor agora é $cor"
 done
 echo "Encontrei minha cor $cor"
 

Neste exemplo, procuramos pela cor Verde. O loop `for` itera sobre cada cor e, assim que encontra a cor verde, o programa sai do loop devido ao comando `break`.

 #Saída
 Procurando por Verde, a cor agora é Violeta
 Procurando por Verde, a cor agora é Índigo
 Procurando por Verde, a cor agora é Azul
 Encontrei minha cor Verde
 

Comando Continue

O comando `continue` permite pular a iteração atual do loop e avançar para a próxima, com base em uma condição específica. Por exemplo, se quisermos evitar a impressão da cor “Verde” no exemplo anterior, podemos usar `continue`. Todas as cores, exceto o Verde, serão exibidas.

 for cor in Violeta Índigo Azul Verde Amarelo Laranja Vermelho
 do
  if [[ "$cor" == 'Verde' ]]; then
  continue
  fi
  echo "$cor"
 done
 
 #Saída
 Violeta
 Índigo
 Azul
 Amarelo
 Laranja
 Vermelho
 

Considerações Finais

Exploramos os usos mais comuns do loop `for` em Bash, abrangendo strings, números, arrays e listas. Se você está aprendendo Linux e utiliza um computador com Windows 10, você pode aproveitar o recurso WSL (Subsistema Windows para Linux) para instalar o Linux em sua máquina.

Isso permitirá que você utilize o terminal Linux de forma similar ao CMD.

Você também pode consultar o artigo “Como Executar Scripts Bash usando Python?” para saber mais.