⬅ Voltar ao Dashboard 2º Bimestre — Shell Script

🔀 Instruções Condicionais (if)

Aula 9 — Ensine seu script a tomar decisões com if, then, else e fi

🚦 O que é uma Instrução Condicional?

Uma instrução condicional permite que o script tome decisões: execute um bloco de comandos se uma condição for verdadeira, e outro (ou nenhum) se for falsa. É como um semáforo — verde executa, vermelho desvia.

Estrutura básica

sintaxe
# if simples if [ condição ] then comandos fi # if com else if [ condição ] then # se verdadeiro comando_a else # se falso comando_b fi # if com elif (múltiplos caminhos) if [ condição1 ] then comando_a elif [ condição2 ] then comando_b else comando_c fi
if simples
condição [ if ] V then ✅ F pula fi
if / else
condição [ if ] V then ✅ F else ❌ fi
if / elif / else
condição1 [ if ] then ✅ V F condição2 [ elif ] then2 V F else ❌ fi

⚠️ Espaços obrigatórios nos colchetes!
[ $IDADE -ge 18 ]    ❌ [$IDADE -ge 18]
Sempre um espaço depois de [ e antes de ]. E fi é if ao contrário — fecha o bloco.

📝 Primeiros Exemplos

if simples — verificar idade

idade.sh
#!/bin/bash IDADE=20 if [ $IDADE -ge 18 ] then echo "Maior de idade! ✅" fi Maior de idade! ✅ # 20 ≥ 18 é verdadeiro → executa o then

if/else — bom dia ou boa tarde

saudacao.sh
#!/bin/bash HORA=14 if [ $HORA -lt 12 ] then echo "Bom dia! ☀️" else echo "Boa tarde! 🌤️" fi Boa tarde! 🌤️ # 14 < 12 é falso → executa o else

📊 Operadores de Comparação

🔢 Numéricos — para comparar inteiros

OperadorSignificadoExemplo
-eqIgual (=)[ 5 -eq 5 ]
-neDiferente (≠)[ 5 -ne 3 ]
-gtMaior que (>)[ 10 -gt 5 ]
-geMaior ou igual (≥)[ 10 -ge 10 ]
-ltMenor que (<)[ 3 -lt 5 ]
-leMenor ou igual (≤)[ 3 -le 5 ]

💡 Dica: eq = equal • ne = not equal • gt = greater than • lt = lower than • ge/le = or equal

🔤 String (Texto) — sempre use aspas nas variáveis

OperadorSignificado
=Strings iguais
!=Strings diferentes
-zString vazia (zero length)
-nString não vazia (non-zero)
strings.sh
if [ "$SENHA" = "abc123" ] then echo "Acesso liberado! 🔓" fi if [ -z "$NOME" ] then echo "Nome obrigatório!" fi

⚠️ Sempre use aspas em variáveis de texto!   ✅ [ "$VAR" = "valor" ]   ❌ [ $VAR = valor ]

📁 Arquivo — testa propriedades de arquivos e diretórios

OperadorVerdadeiro se…
-fFor um arquivo regular
-dFor um diretório
-eExistir (arquivo ou pasta)
-rTiver permissão de leitura
-wTiver permissão de escrita
-xTiver permissão de execução
-sNão estiver vazio (size > 0)
backup.sh
#!/bin/bash ARQUIVO="dados.txt" if [ -f "$ARQUIVO" ] then cp "$ARQUIVO" backup/ else echo "Não encontrado! ❌" fi if [ ! -d "backup" ] then mkdir backup fi

💡 Sempre verifique se arquivo ou pasta existe antes de usar. Tentar ler um arquivo inexistente gera erro e interrompe o script.

🔗 Operadores Lógicos e Exit Codes

Combinando condições

OperadorNomeSignificado
-aANDAmbas as condições verdadeiras
-oORPelo menos uma verdadeira
!NOTInverte o resultado
logicos.sh
# AND: pode dirigir se maior de idade E habilitado if [ $IDADE -ge 18 -a "$CNH" = "sim" ] then echo "Pode dirigir! 🚗" fi # OR: desconto se VIP OU compra acima de R$100 if [ "$VIP" = "sim" -o $VALOR -ge 100 ] then echo "Desconto aplicado! 🎉" fi # NOT: acesso negado se não for root if [ ! "$USER" = "root" ] then echo "Acesso negado!" fi

Exit codes e o if

O if pode testar diretamente o código de saída de qualquer comando — sem precisar de colchetes. Exit code 0 = verdadeiro; qualquer outro valor = falso.

exit-code.sh
# ls retorna 0 se a pasta existe if ls /home >/dev/null 2>&1 then echo "Pasta /home existe!" else echo "Pasta não encontrada" fi # grep retorna 0 se encontra o padrão if grep -q "root" /etc/passwd then echo "Usuário root existe" fi

💡 2>/dev/null suprime mensagens de erro. -q no grep deixa o comando silencioso — só o exit code importa. Essa técnica é muito usada em scripts de verificação.

Visualização animada — exit code como condição do if
exit 0 → sucesso exit ≠0 → erro grep -q "root" /etc/passwd comando exit code? $? 0 then ✅ executa bloco ≠ 0 else ❌ trata o erro

🔧 Exemplos Práticos Completos

Sistema de login simples

login.sh
#!/bin/bash # login.sh — sistema de autenticação simples echo "=== SISTEMA DE LOGIN ===" read -p "Usuário: " USUARIO read -s -p "Senha: " SENHA echo if [ "$USUARIO" = "admin" -a "$SENHA" = "123456" ] then echo "✅ Login realizado com sucesso!" echo "Bem-vindo, $USUARIO!" else echo "❌ Usuário ou senha incorretos!" fi

Verificador de sistema

verificador.sh
#!/bin/bash # verificador.sh — checa estado do sistema echo "=== VERIFICAÇÃO DO SISTEMA ===" # 1. Pasta de backup existe? if [ -d "/backup" ] then echo "✅ Pasta /backup existe" else echo "⚠️ Pasta /backup NÃO existe" fi # 2. Uso do disco acima de 90%? ESPACO=$(df / | tail -1 | awk '{print $5}' | tr -d '%') if [ $ESPACO -gt 90 ] then echo "🔴 ALERTA: disco com ${ESPACO}% de uso!" else echo "✅ Disco OK: ${ESPACO}% de uso" fi

📋 Resumo: Operadores

-eq / -ne Igual / Diferente Números
-gt / -lt Maior / Menor Números
-ge / -le ≥ e ≤ Números
= / != Igual / Diferente Strings
-z / -n Vazia / Não vazia Strings
-f / -d Arquivo / Diretório Arquivos
-e / -s Existe / Não vazio Arquivos
-r / -w / -x Permissões Arquivos
-a / -o / ! AND / OR / NOT Lógicos

Regras de ouro: espaços dentro dos [ ] • aspas em variáveis de string • verifique arquivos antes de usar • fi sempre fecha o bloco

🎯 Exercício — Arraste e Conecte

Arraste cada descrição para o operador correto.

Descrição
Verdadeiro se o número for maior que outro
Verdadeiro se a string estiver vazia
Verdadeiro se o caminho for um arquivo regular
Verdadeiro se o caminho for um diretório
Exige que ambas as condições sejam verdadeiras
Inverte o resultado da condição
Operador
-gt
-z
-f
-d
-a
!

🛠️ Atividade Prática — Scripts com Condicionais

⏱ ~25 min 💻 Terminal Bash 📸 Tirar screenshot da saída
1
Crie o script de notas
Escreva notas.sh com if/elif/else que classifica a nota. Teste com três valores diferentes:
~/scripts/notas.sh
#!/bin/bash read -p "Digite a nota (0-100): " NOTA if [ "$NOTA" -ge 70 ]; then echo "✅ Aprovado" elif [ "$NOTA" -ge 50 ]; then echo "⚠️ Recuperação" else echo "❌ Reprovado" fi
bash — testar com três valores
usuario@servidor:~/scripts$ ./notas.sh Digite a nota (0-100): 85 ✅ Aprovado usuario@servidor:~/scripts$ ./notas.sh Digite a nota (0-100): 55 ⚠️ Recuperação usuario@servidor:~/scripts$ ./notas.sh Digite a nota (0-100): 30 ❌ Reprovado
2
Teste operadores de arquivo
Escreva checa_arquivo.sh que pede um caminho e identifica se é arquivo, diretório ou não existe:
~/scripts/checa_arquivo.sh
#!/bin/bash read -p "Informe o caminho: " CAMINHO if [ -f "$CAMINHO" ]; then echo "📄 É um arquivo regular" elif [ -d "$CAMINHO" ]; then echo "📁 É um diretório" elif [ ! -e "$CAMINHO" ]; then echo "❌ Não existe" fi
bash — testar
usuario@servidor:~/scripts$ ./checa_arquivo.sh Informe o caminho: /etc/hosts 📄 É um arquivo regular usuario@servidor:~/scripts$ ./checa_arquivo.sh Informe o caminho: /var/log 📁 É um diretório
3
Script com operadores lógicos
Escreva acesso.sh que só libera acesso quando usuário AND senha estiverem corretos simultaneamente:
~/scripts/acesso.sh
#!/bin/bash read -p "Usuário: " USR read -sp "Senha: " PWD echo if [ "$USR" = "admin" -a "$PWD" = "1234" ]; then echo "✅ Acesso liberado!" else echo "❌ Credenciais inválidas" exit 1 fi
bash — testar credenciais
usuario@servidor:~/scripts$ ./acesso.sh Usuário: admin Senha: ✅ Acesso liberado! usuario@servidor:~/scripts$ ./acesso.sh Usuário: admin Senha: ❌ Credenciais inválidas
4
Verificador de sistema com exit code
Escreva verifica_servico.sh que usa o exit code do systemctl is-active diretamente no if, sem colchetes:
~/scripts/verifica_servico.sh
#!/bin/bash SERVICO="${1:-ssh}" # usa $1 ou "ssh" como padrão if systemctl is-active --quiet "$SERVICO"; then echo "✅ $SERVICO: OK (ativo)" else echo "❌ $SERVICO: Inativo" exit 1 fi
bash — testar serviços
usuario@servidor:~/scripts$ ./verifica_servico.sh ssh ✅ ssh: OK (ativo) usuario@servidor:~/scripts$ ./verifica_servico.sh nginx ❌ nginx: Inativo
📌 Para refletir: O if é a base de scripts inteligentes. Combinando operadores numéricos, de string e de arquivo com operadores lógicos, você consegue criar scripts que se adaptam a qualquer cenário — do simples backup ao monitoramento de servidores.

❓ Verifique seu Conhecimento

Qual a sintaxe correta de um if em Bash?

Aif (condição) { comandos }
Bif [ condição ]; then comandos; fi
Cif condição: comandos end
Dif { condição } do comandos done
✓ Em Bash: if [ condição ]; then ... elif [ ... ]; then ... else ... fi. Note os espaços dentro dos colchetes!

Qual operador testa se dois números são iguais em Bash?

A==
B=
C-eq
D-is
✓ Para números: -eq (igual), -ne (diferente), -lt (menor), -gt (maior). Para strings: == e !=.

Qual flag testa se um arquivo existe e é um diretório?

A-d
B-f
C-e
D-r
-d = é diretório, -f = é arquivo regular, -e = existe (qualquer tipo), -r = tem permissão de leitura.

Como combinar duas condições com E lógico (ambas devem ser verdadeiras)?

Aif [ cond1 ] OR [ cond2 ]
Bif [ cond1 ] AND [ cond2 ]
Cif [ cond1 | cond2 ]
Dif [ cond1 ] && [ cond2 ]
✓ Use && para E lógico e || para OU lógico entre condições. Ou use [[ cond1 && cond2 ]] em duplos colchetes.