⬅ Voltar ao Dashboard 2º Bimestre — Shell Script

🔄 Loops while

Aula 12 — Repita enquanto a condição for verdadeira: contadores, menus interativos e leitura de arquivos linha por linha

🚦 O que é um Loop while?

O while repete um bloco de comandos enquanto uma condição for verdadeira. A cada iteração a condição é testada novamente; quando se torna falsa, o loop encerra.

Estrutura básica

sintaxe
while [ condição ] do comandos # IMPORTANTE: modifique a variável de controle! done

Como funciona

  1. Testa a condição
  2. Se verdadeira → executa os comandos e volta ao passo 1
  3. Se falsa → sai do loop e continua o script

⚠️ Regra de ouro: sempre modifique a variável de controle dentro do loop. Se a condição nunca mudar, o loop será infinito ∞ e o script trava. Use Ctrl+C para interromper.

🎯 Primeiro Exemplo: Contador

contador.sh
#!/bin/bash CONTADOR=1 while [ $CONTADOR -le 5 ] do echo "Volta $CONTADOR" CONTADOR=$(($CONTADOR + 1)) done echo "Terminei!" Volta 1 Volta 2 Volta 3 Volta 4 Volta 5 Terminei!

🔢 Operadores de Comparação

Os operadores abaixo são usados dentro de [ ] para comparar valores numéricos e definir quando o loop para.

OperadorSignificadoDica de memória
-ltMenor que (<)Less Than
-leMenor ou igual (≤)Less or Equal
-gtMaior que (>)Greater Than
-geMaior ou igual (≥)Greater or Equal
-eqIgual (=)EQual
-neDiferente (≠)Not Equal

Exemplo: contagem regressiva

regressiva.sh
N=5 while [ $N -gt 0 ] do echo "$N..." N=$(($N - 1)) done echo "Lançar!"

➕ Operações Matemáticas com $(( ))

A construção $(( )) realiza cálculo aritmético no Bash e é fundamental para modificar o contador em loops while.

OperaçãoSintaxe
Somar 1N=$(($N + 1))
Subtrair 1N=$(($N - 1))
MultiplicarN=$(($N * 2))
DividirN=$(($N / 2))
RestoN=$(($N % 3))

Exemplo: acumulador de soma

somador.sh
SOMA=0 N=1 while [ $N -le 5 ] do SOMA=$(($SOMA + $N)) echo "Soma após $N: $SOMA" N=$(($N + 1)) done Soma após 1: 1 Soma após 2: 3 Soma após 3: 6 Soma após 4: 10 Soma após 5: 15

♾️ while true e break

while true cria um loop que nunca termina por si só. O comando break funciona como a saída de emergência: encerra o loop imediatamente quando executado.

Estrutura com break

sintaxe
while true do comandos if [ condição de saída ]; then break fi done

Exemplo: repetir até o usuário digitar “sair”

loop-usuario.sh
while true do read -p "Digite algo (sair para parar): " R if [ "$R" = "sair" ]; then echo "Tchau!" break fi echo "Você disse: $R" done

💡 while true é ideal para menus que precisam continuar até o usuário escolher sair. Sempre garanta que exista pelo menos um caminho que execute break.

🎮 break e continue

Esses dois comandos controlam o fluxo dentro de qualquer loop Bash.

🛑 break — Sai do loop

N=1 while [ $N -le 10 ] do if [ $N -eq 5 ]; then break fi echo "$N" N=$(($N + 1)) done # Saída: 1 2 3 4

⏭️ continue — Pula a volta

N=0 while [ $N -lt 5 ] do N=$(($N + 1)) if [ $N -eq 3 ]; then continue fi echo "$N" done # Saída: 1 2 4 5

📌 Diferença: break encerra o loop completamente; continue pula apenas a iteração atual e volta ao teste da condição.

💬 Interação com Usuário

O comando read captura a entrada do teclado e armazena em uma variável. Combinado com while true, permite loops que dependem completamente da resposta do usuário.

Somador interativo

somador-interativo.sh
SOMA=0 while true do read -p "Número (0 para sair): " N if [ "$N" = "0" ]; then break fi SOMA=$(($SOMA + $N)) echo "Total até agora: $SOMA" done echo "Soma final: $SOMA"

Jogo de adivinhação

adivinha.sh
SECRETO=7 TENT=0 echo "Adivinhe o número (1-10)!" while true do TENT=$(($TENT + 1)) read -p "Palpite: " P if [ $P -eq $SECRETO ]; then echo "Acertou em $TENT tentativa(s)!" break elif [ $P -lt $SECRETO ]; then echo "Maior!" else echo "Menor!" fi done

🍔 Menu Interativo

A combinação while true + case + break é o padrão clássico para menus de sistema que permanecem ativos até o usuário optar por sair.

menu.sh
#!/bin/bash # Menu interativo com while + case while true do clear echo "╔═══════════════════════╗" echo "║ MENU PRINCIPAL ║" echo "╠═══════════════════════╣" echo "║ 1) Ver data/hora ║" echo "║ 2) Ver usuário ║" echo "║ 3) Listar arquivos ║" echo "║ 0) Sair ║" echo "╚═══════════════════════╝" read -p "Opção: " OPC case "$OPC" in 1) date ;; 2) whoami ;; 3) ls -la ;; 0) echo "Tchau!"; break ;; *) echo "Opção inválida!" ;; esac read -p "Pressione Enter para continuar..." done

💡 Padrão profissional: while true + case + break é amplamente usado em scripts de administração de sistemas Linux para menus de configuração e manutenção.

📄 Lendo Arquivos Linha por Linha

O padrão while read é a forma correta de processar arquivos linha a linha no Bash. Ao contrário do for (que separa por espaços), este padrão preserva a linha inteira.

Estrutura

sintaxe
while read LINHA do echo "$LINHA" done < arquivo.txt

Exemplo: numerar usuários de um arquivo

listar-usuarios.sh
# usuarios.txt contém: "Ana Silva", "Pedro Santos" NUM=1 while read NOME do echo "$NUM: $NOME" NUM=$(($NUM + 1)) done < usuarios.txt 1: Ana Silva 2: Pedro Santos

📌 FOR vs WHILE READ: for NOME in $(cat arq) trata “Ana Silva” como dois itens. while read NOME trata a linha inteira como um só item. Para nomes compostos, sempre use while read.

🚀 Projeto: Contador de Palavras

Exemplo completo que combina while true, validação com -z, break e um for interno para contar palavras digitadas pelo usuário.

conta-palavras.sh
#!/bin/bash # Conta palavras em frases digitadas echo "CONTADOR DE PALAVRAS" echo "(Enter vazio para encerrar)" TOTAL_FRASES=0 TOTAL_PALAVRAS=0 while true do read -p "Frase: " FRASE if [ -z "$FRASE" ]; then break fi PALAVRAS=0 for P in $FRASE; do PALAVRAS=$(($PALAVRAS + 1)) done TOTAL_FRASES=$(($TOTAL_FRASES + 1)) TOTAL_PALAVRAS=$(($TOTAL_PALAVRAS + $PALAVRAS)) echo "Frase $TOTAL_FRASES: $PALAVRAS palavra(s)" done echo "Total: $TOTAL_FRASES frases, $TOTAL_PALAVRAS palavras"

⚖️ for vs while

🔁 Use for quando…

  • Sabe quantas vezes repetir
  • Tem uma lista de itens
  • Processa arquivos com wildcard
  • Sequências numéricas simples

🔄 Use while quando…

  • Não sabe quantas vezes repetir
  • Depende de uma condição variável
  • Precisa de entrada do usuário
  • Ler arquivos linha por linha
resumo
# FOR — lista conhecida for i in 1 2 3 4 5 for arq in *.txt # WHILE — condição dinâmica while [ $n -lt 10 ] while read linha

💡 Regra simples: “Tenho uma lista de itens?” → use for. “Preciso de uma condição para parar?” → use while. Os dois se complementam e podem ser combinados.

🎯 Exercício — Arraste e Conecte

Relacione cada elemento do while à sua função.

Função
Encerra o bloco do loop
Sai do loop imediatamente
Pula para a próxima iteração
Compara se é menor ou igual
Testa se uma string está vazia
Lê arquivo linha por linha
Elemento
done
break
continue
-le
-z
while read LINHA

🛠️ Atividade Prática — Loops WHILE

⏱ ~30 min 💻 Terminal Bash 📸 Tirar screenshot da saída
1
Contador básico
Crie contador.sh que use while para contar de 1 até 10, exibindo cada número. Em seguida, adapte para contar de 10 até 1 (contagem regressiva) usando -gt e decremento.
2
Menu interativo
Crie menu.sh com while true + case que ofereça 4 opções: exibir data (date), espaço em disco (df -h), usuário logado (whoami) e sair. O menu deve reaparecer após cada ação.
3
Leitura de arquivo
Crie um arquivo nomes.txt com 5 nomes completos (um por linha). Faça ler-nomes.sh com while read que exiba cada nome numerado e também conte quantas letras tem cada nome com ${#NOME}.
4
Jogo de adivinhação
Implemente adivinha.sh com número secreto fixo. Use while true e dê dicas “Maior!” ou “Menor!”. Ao acertar, exiba o número de tentativas. Bônus: limite em 5 tentativas usando um contador com break ao atingir o limite.
📌 Para refletir: o loop while brilha em situações onde o número de repetições depende de uma condição em tempo de execução. Menus, jogos e processamento de arquivos são os casos de uso mais frequentes em scripts de administração Linux.

❓ Verifique seu Conhecimento

Qual a diferença entre while e until em Bash?

Awhile executa uma vez, until executa várias
Bwhile executa enquanto a condição é verdadeira; until executa enquanto é falsa
Cuntil é mais rápido que while
DNão há diferença prática entre eles
while [ condição ]: continua enquanto verdadeiro. until [ condição ]: continua enquanto falso (para quando torna-se verdadeiro).

Como criar um loop infinito em Bash com while?

Awhile (forever); do comandos; done
Bwhile loop; do comandos; done
Cwhile true; do comandos; done
Dwhile :infinite:; do comandos; done
while true ou while : criam loops infinitos. Sempre inclua uma condição de saída com break para não travar o sistema.

O que faz read -t 5 resposta em um script?

ALê entrada com timeout de 5 segundos
BRepete a leitura 5 vezes
CLê no máximo 5 caracteres
DAguarda 5 segundos antes de ler
read -t N define um timeout: se o usuário não digitar em N segundos, o comando retorna com código de erro. Útil em scripts de monitoramento.

Qual comando Bash monitora continuamente o uso de disco a cada 5 segundos com while?

Awhile disk; do df -h; wait 5; done
Bwhile monitor; do check-disk; sleep 5; done
Cloop disk-monitor --interval 5
Dwhile true; do df -h; sleep 5; done
✓ Padrão de monitoramento: while true; do comando; sleep N; done. Ctrl+C para interromper. Redirecione para log com >> /var/log/monitor.log.