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.