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 simplesif [ condição ]
then
comandos
fi# if com elseif [ 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
if / else
if / elif / else
⚠️ 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/bashIDADE=20if [ $IDADE-ge18 ]
thenecho"Maior de idade! ✅"fiMaior de idade! ✅# 20 ≥ 18 é verdadeiro → executa o then
if/else — bom dia ou boa tarde
saudacao.sh
#!/bin/bashHORA=14if [ $HORA-lt12 ]
thenecho"Bom dia! ☀️"elseecho"Boa tarde! 🌤️"fiBoa tarde! 🌤️# 14 < 12 é falso → executa o else
📊 Operadores de Comparação
🔢 Numéricos — para comparar inteiros
Operador
Significado
Exemplo
-eq
Igual (=)
[ 5 -eq 5 ]
-ne
Diferente (≠)
[ 5 -ne 3 ]
-gt
Maior que (>)
[ 10 -gt 5 ]
-ge
Maior ou igual (≥)
[ 10 -ge 10 ]
-lt
Menor que (<)
[ 3 -lt 5 ]
-le
Menor ou igual (≤)
[ 3 -le 5 ]
💡 Dica:eq = equal • ne = not equal • gt = greater than • lt = lower than • ge/le = or equal
💡 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
Operador
Nome
Significado
-a
AND
Ambas as condições verdadeiras
-o
OR
Pelo menos uma verdadeira
!
NOT
Inverte o resultado
logicos.sh
# AND: pode dirigir se maior de idade E habilitadoif [ $IDADE-ge 18 -a"$CNH" = "sim" ]
thenecho"Pode dirigir! 🚗"fi# OR: desconto se VIP OU compra acima de R$100if [ "$VIP" = "sim"-o$VALOR-ge100 ]
thenecho"Desconto aplicado! 🎉"fi# NOT: acesso negado se não for rootif [ ! "$USER" = "root" ]
thenecho"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 existeifls/home >/dev/null 2>&1
thenecho"Pasta /home existe!"elseecho"Pasta não encontrada"fi# grep retorna 0 se encontra o padrãoifgrep-q"root"/etc/passwdthenecho"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
🔧 Exemplos Práticos Completos
Sistema de login simples
login.sh
#!/bin/bash# login.sh — sistema de autenticação simplesecho"=== SISTEMA DE LOGIN ==="read-p"Usuário: "USUARIOread-s -p"Senha: "SENHAechoif [ "$USUARIO" = "admin"-a"$SENHA" = "123456" ]
thenecho"✅ Login realizado com sucesso!"echo"Bem-vindo, $USUARIO!"elseecho"❌ Usuário ou senha incorretos!"fi
Verificador de sistema
verificador.sh
#!/bin/bash# verificador.sh — checa estado do sistemaecho"=== VERIFICAÇÃO DO SISTEMA ==="# 1. Pasta de backup existe?if [ -d"/backup" ]
thenecho"✅ Pasta /backup existe"elseecho"⚠️ Pasta /backup NÃO existe"fi# 2. Uso do disco acima de 90%?ESPACO=$(df / | tail -1 | awk '{print $5}' | tr -d '%')if [ $ESPACO-gt90 ]
thenecho"🔴 ALERTA: disco com ${ESPACO}% de uso!"elseecho"✅ Disco OK: ${ESPACO}% de uso"fi
📋 Resumo: Operadores
-eq / -neIgual / DiferenteNúmeros
-gt / -ltMaior / MenorNúmeros
-ge / -le≥ e ≤Números
= / !=Igual / DiferenteStrings
-z / -nVazia / Não vaziaStrings
-f / -dArquivo / DiretórioArquivos
-e / -sExiste / Não vazioArquivos
-r / -w / -xPermissõesArquivos
-a / -o / !AND / OR / NOTLó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/bashread-p"Digite a nota (0-100): "NOTAif [ "$NOTA"-ge70 ]; thenecho"✅ Aprovado"elif [ "$NOTA"-ge50 ]; thenecho"⚠️ Recuperação"elseecho"❌ Reprovado"fi
bash — testar com três valores
usuario@servidor:~/scripts$./notas.shDigite a nota (0-100): 85✅ Aprovadousuario@servidor:~/scripts$./notas.shDigite a nota (0-100): 55⚠️ Recuperaçãousuario@servidor:~/scripts$./notas.shDigite 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/bashread-p"Informe o caminho: "CAMINHOif [ -f"$CAMINHO" ]; thenecho"📄 É um arquivo regular"elif [ -d"$CAMINHO" ]; thenecho"📁 É um diretório"elif [ ! -e"$CAMINHO" ]; thenecho"❌ Não existe"fi
bash — testar
usuario@servidor:~/scripts$./checa_arquivo.shInforme o caminho: /etc/hosts📄 É um arquivo regularusuario@servidor:~/scripts$./checa_arquivo.shInforme 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:
Escreva verifica_servico.sh que usa o exit code do systemctl is-active diretamente no if, sem colchetes:
~/scripts/verifica_servico.sh
#!/bin/bashSERVICO="${1:-ssh}"# usa $1 ou "ssh" como padrãoif systemctl is-active --quiet"$SERVICO"; thenecho"✅ $SERVICO: OK (ativo)"elseecho"❌ $SERVICO: Inativo"exit1fi
bash — testar serviços
usuario@servidor:~/scripts$./verifica_servico.shssh✅ ssh: OK (ativo)usuario@servidor:~/scripts$./verifica_servico.shnginx❌ 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.