⬅ Voltar ao Dashboard 2º Bimestre — Shell Script

🔁 Loops for

Aula 11 — Repetição inteligente: percorra listas, arquivos e sequências automatizando tarefas no Shell Script

🎡 O que são Loops?

Um loop é uma estrutura que executa um bloco de comandos repetidamente para cada elemento de uma lista. No Bash, o for é o loop mais usado: para cada item da lista, o bloco entre do e done é executado uma vez.

❌ Sem loop — código repetitivo

echo "Arquivo1" echo "Arquivo2" echo "Arquivo3" # 50 linhas iguais...

✅ Com loop — limpo e eficiente

for ARQ in arq1 arq2 arq3 do echo "$ARQ" done

📌 O princípio do for: "Para cada item da lista, faça isso." Use loops para processar listas de arquivos, gerar sequências, automatizar renomeamentos e muito mais.

📝 Sintaxe Básica do for

Estrutura geral

sintaxe
for VARIAVEL in lista do comandos usando "$VARIAVEL" done
Palavra-chaveFunção
forInicia o loop
VARIAVELRecebe cada valor da lista a cada iteração
inSepara a variável da lista de valores
doInicia o bloco de comandos
doneEncerra o bloco (obrigatório!)

Exemplo com números

numeros.sh
for NUM in 1 2 3 4 5 do echo "Número: $NUM" done Número: 1 Número: 2 Número: 3 Número: 4 Número: 5

💡 Regra de ouro: espaços separam os itens da lista — a b c é uma lista de 3 elementos. Sempre feche o loop com done.

🔤 FOR com Palavras (Strings)

A lista pode conter qualquer palavra ou string. Cada token separado por espaço é tratado como um item.

Lista de frutas

frutas.sh
#!/bin/bash for FRUTA in maçã banana laranja do echo "Eu gosto de $FRUTA" done Eu gosto de maçã Eu gosto de banana Eu gosto de laranja

Lista de nomes

saudacoes.sh
for NOME in Ana Pedro Maria do echo "Olá, $NOME!" done Olá, Ana! Olá, Pedro! Olá, Maria!

🌟 FOR com Wildcards (Arquivos)

Combinando o for com wildcards é possível processar automaticamente todos os arquivos que correspondem a um padrão, sem precisar listar cada nome manualmente.

PadrãoCombina com…
*.txtTodos os arquivos .txt
foto*Arquivos que começam com "foto"
*2024*Arquivos que contêm "2024"
*Todos os arquivos do diretório
*.jpg *.pngImagens jpg e png

Exemplo: backup automático

backup.sh
#!/bin/bash mkdir -p backup for ARQ in *.txt do echo "Copiando $ARQ..." cp "$ARQ" backup/ done echo "Backup completo!"

⚠️ Sempre use aspas: "$ARQ" protege nomes de arquivo que contêm espaços. Sem aspas, um arquivo chamado meu texto.txt seria tratado como dois itens separados.

🔢 Sequências com Chaves { }

A expansão de chaves gera sequências numéricas ou alfabéticas diretamente no Bash, sem precisar de comandos externos.

SintaxeResultado
{1..5}1 2 3 4 5
{5..10}5 6 7 8 9 10
{A..E}A B C D E
{2..10..2}2 4 6 8 10 (passo 2)
{a..z}todas as letras minúsculas

Exemplo: criar pastas por ano

pastas-anuais.sh
for ANO in {2020..2024} do mkdir "relatorios_$ANO" echo "Criada: relatorios_$ANO" done Criada: relatorios_2020 Criada: relatorios_2021 Criada: relatorios_2022 Criada: relatorios_2023 Criada: relatorios_2024

💡 As chaves são expandidas pelo próprio Bash antes da execução, sendo mais rápidas que o comando seq. Também funcionam com letras: {a..f}.

🔢 Comando seq

O seq gera sequências numéricas com controle de início, fim e passo. É útil quando os valores são definidos por variáveis (as chaves não suportam variáveis).

ComandoResultado
seq 51 2 3 4 5
seq 3 73 4 5 6 7
seq 2 2 102 4 6 8 10
seq 10 -1 110 9 8 … 1 (regressivo)

Exemplo: contagem regressiva

contagem.sh
for N in $(seq 10 -1 1) do echo "$N..." sleep 1 done echo "Lançar!"

📌 A construção $(comando) executa o comando e usa sua saída como a lista do for. Essa técnica funciona com qualquer comando que produza palavras na saída.

⚙️ FOR Estilo C

O Bash também suporta a sintaxe de loop for tradicional das linguagens C/Java, com inicialização, condição e incremento explícitos.

Estrutura

sintaxe
for (( i=início; i<=fim; i++ )) do comandos done
OperadorSignificadoExemplo
i++Incrementa 10, 1, 2, 3…
i--Decrementa 15, 4, 3, 2…
i+=2Incrementa 20, 2, 4, 6…
i*=2Multiplica por 21, 2, 4, 8…

Exemplo: números pares de 2 a 10

pares.sh
for (( i=2; i<=10; i+=2 )) do echo "Par: $i" done Par: 2 Par: 4 Par: 6 Par: 8 Par: 10

📄 FOR com Conteúdo de Arquivo

Combinando $(cat arquivo) com o for, o loop itera sobre cada palavra do arquivo. É útil para processar listas armazenadas em disco.

Lendo nomes de um arquivo

ler-nomes.sh
# Conteúdo de nomes.txt: Ana Pedro Maria for NOME in $(cat nomes.txt) do echo "Olá, $NOME!" done Olá, Ana! Olá, Pedro! Olá, Maria!

Testando conectividade de uma lista de sites

ping-sites.sh
for SITE in $(cat sites.txt) do if ping -c 1 "$SITE" >/dev/null; then echo "$SITE OK" else echo "$SITE FALHOU" fi done

⚠️ Atenção: o for separa por espaços, não por linhas. “Nome Completo” vira dois itens (Nome e Completo). Para processar linha por linha, use while read.

🚀 Projeto: Renomeador de Fotos

Exemplo completo que combina wildcards, variáveis, incremento e validação com if para renomear automaticamente uma coleção de imagens em sequência.

renomeador.sh
#!/bin/bash # Renomeia fotos em sequência numerada echo "RENOMEADOR DE FOTOS" echo "===================" CONTADOR=1 for FOTO in *.jpg *.png do if [ -f "$FOTO" ]; then EXT="${FOTO##*.}" NOVO="foto_${CONTADOR}.$EXT" mv "$FOTO" "$NOVO" echo "$FOTO → $NOVO" CONTADOR=$(($CONTADOR + 1)) fi done echo "$(($CONTADOR - 1)) fotos renomeadas!"

💡 Boas Práticas

✅ Faça isso

# Nome descritivo for ARQUIVO_TEXTO in *.txt # Aspas nas variáveis cp "$ARQUIVO" backup/ # Verificar se existe if [ -f "$ARQ" ]; then

❌ Evite isso

# Nome genérico for i in *.txt # Sem aspas (quebra com espaços) cp $ARQUIVO backup/ # Assumir que existe cat $ARQ

📋 Checklist: use nomes descritivos • sempre aspas em "$VAR" • valide com -f antes de operar arquivos • teste o script com echo antes de executar ações destrutivas.

📋 Resumo: Tipos de for

for i in lista Lista Manual Itens separados por espaço
for i in *.txt Wildcards Padrões de arquivos
for i in {1..10} Chaves Sequências rápidas
for i in $(seq 1 10) seq Sequências flexíveis
for ((i=1;i<=10;i++)) Estilo C Controle preciso
for i in $(cat arq) De Arquivo Palavras do arquivo
estrutura completa
for VAR in lista/padrão/sequência do comandos usando "$VAR" # aspas sempre! done

🎯 Exercício — Arraste e Conecte

Relacione cada sintaxe do for à sua descrição.

Descrição
Gera sequência sem comandos externos
Processa todos os arquivos com extensão .txt
Usa a saída de um comando como lista
Controle numérico preciso estilo linguagem C
Encerra o bloco do loop
Lê palavras de um arquivo
Sintaxe
{1..10}
*.txt
$(seq 1 5)
((i=1;i<=5;i++))
done
$(cat arq.txt)

🛠️ Atividade Prática — Automatizando com FOR

⏱ ~30 min 💻 Terminal Bash 📸 Tirar screenshot da saída
1
Backup com wildcards
Crie backup.sh que crie a pasta backup/ e copie todos os arquivos .txt do diretório atual para ela usando for com wildcard. Exiba o nome de cada arquivo copiado.
2
Contagem e sequências
Crie sequencias.sh com três loops: um com {1..10}, um com $(seq 0 2 20) (pares até 20) e uma contagem regressiva de 5 até 1 com sleep 1.
3
Estrutura de diretórios
Crie criar-estrutura.sh que use for ANO in {2022..2025} para criar pastas relatorio_ANO e dentro de cada uma as subpastas jan, fev e mar com outro for aninhado.
4
Renomeador com contador
Adapte o renomeador.sh da aula para renomear arquivos .txt no formato doc_001.txt, doc_002.txt, usando printf para formatar o número com zeros à esquerda: printf "%03d" $CONTADOR.
📌 Para refletir: o loop for é a ferramenta central de automação em Shell Script. Combinar wildcards, sequências e substituição de comandos permite processar dezenas ou centenas de arquivos com apenas algumas linhas de código.

❓ Verifique seu Conhecimento

Qual a sintaxe correta de um loop for em Bash para iterar sobre uma lista?

Afor item in lista; do comandos; done
Bfor (item in lista) { comandos }
Cforeach item lista do comandos end
Dloop for item in lista: comandos
✓ Sintaxe Bash: for item in valor1 valor2 valor3; do echo $item; done. Use $(seq 1 10) para sequências numéricas.

O que o comando seq 1 5 retorna?

AUm único número aleatório entre 1 e 5
BA sequência 5 4 3 2 1
COs números 1 2 3 4 5 (um por linha)
DO intervalo [1,5] como string
seq 1 5 gera 1 2 3 4 5. Use seq 1 2 10 para pular de 2 em 2. Muito útil em for i in $(seq 1 10).

Como processar todos os arquivos .txt de um diretório com for?

Afor file in directory/*.txt; do ... done
Bfor file in *.txt; do ... done
Cfor (*.txt) as file; do ... done
Dforeach .txt file; do ... done
for file in *.txt usa expansão de glob — o shell substitui *.txt pela lista de arquivos correspondentes antes de executar o loop.

O que faz o comando break dentro de um loop for?

APausa o loop por 1 segundo
BPula para a próxima iteração
CReinicia o loop do início
DEncerra o loop imediatamente
break sai do loop. continue pula para a próxima iteração. Use break 2 para sair de dois loops aninhados.