No desenvolvimento de scripts Shell, as estruturas de repetição (loops) são ferramentas essenciais para automação. Elas premitem que um bloco de comandos seja executado múltiplas vezes até que uma condição específica seja aetndida. É fundamental garantir que todo loop possua uma condição de saída clara para evitar execuções infinitas que possam travar o sistema.
O Loop for
O loop for é ideal quando o número de iterações é conhecido previamente. Ele percorre uma lista de elementos e executa os comandos definidos para cada item da lista.
Sintaxe básica
for variavel in lista; do
comandos
done
A lista pode ser definida de várias formas:
{1..10}: Sequência de 1 a 10.{0..20..2}: De 0 a 20, saltando de 2 em 2 (números pares).$(ls *.sh): Resultado de um comando.
Exemplo: Somando valores de 1 a 100
#!/bin/bash
soma_total=0
for valor in {1..100}
do
let soma_total+=valor
done
echo "O resultado da soma é: $soma_total"
Formato estilo C
O Shell também suporta a sintaxe clássica da linguagem C, útil para manipulação direta de contadores.
#!/bin/bash
total=0
for ((i=1; i<=100; i++))
do
((total += i))
done
echo "Soma calculada: $total"
Aplicações Práticas com for
Renomear extensões de arquivos
Este script altera a extensão de todos os arquivos .log para .old no diretório atual.
#!/bin/bash
for arquivo in *.log
do
nome_base=$(echo $arquivo | cut -d"." -f1)
mv "$arquivo" "${nome_base}.old"
done
Gerador de Tabuada
#!/bin/bash
for x in {1..9}
do
for y in $(seq $x)
do
echo -ne "${y}x${x}=$((x*y))\t"
done
echo ""
done
Monitoramento de Rede (Ping Sweep)
Verifica quais endereços IP de uma sub-rede estão ativos.
#!/bin/bash
rede="192.168.1"
for host in {1..254}
do
{
ping -c1 -W1 ${rede}.${host} &>/dev/null
if [ $? -eq 0 ]; then
echo "Host ${rede}.${host} ONLINE" >> hosts_ativos.txt
else
echo "Host ${rede}.${host} OFFLINE" >> hosts_inativos.txt
fi
} &
done
wait
echo "Varredura concluída."
O Loop while
O while executa um bloco de comandos enquanto uma condição específica for verdadeira. É útil quando não sabemos exatamente quantas iterações serão necessárias.
Sintaxe
while [ condicao ]
do
comandos
done
Exemplo: Jogo de Adivinhação
#!/bin/bash
numero_secreto=$(( RANDOM % 100 + 1 ))
tentativas=0
palpite=0
while [ "$palpite" -ne "$numero_secreto" ]
do
read -p "Digite um número (1-100): " palpite
let tentativas++
if [ "$palpite" -gt "$numero_secreto" ]; then
echo "Muito alto!"
elif [ "$palpite" -lt "$numero_secreto" ]; then
echo "Muito baixo!"
else
echo "Parabéns! Você acertou em $tentativas tentativas."
fi
done
O Loop until
Diferente do while, o until continua a execução enquanto a condição for falsa. O loop para no momento em que a condição se torna verdadeira.
Exemplo: Acumulador com until
#!/bin/bash
contador=1
resultado=0
until [ $contador -gt 100 ]
do
resultado=$((resultado + contador))
let contador++
done
echo "Soma total (until): $resultado"