⬅ 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

Diagrama de fluxo

❓ Condição
Verdadeiro
✅ Executa bloco then
Falso
⏭️ Pula ou executa 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/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

if/elif/else — sistema de notas

notas.sh
#!/bin/bash NOTA=65 if [ $NOTA -ge 70 ] then echo "Aprovado! 🎉" elif [ $NOTA -ge 50 ] then echo "Recuperação 📚" else echo "Reprovado 😞" fi Recuperação 📚

🔢 Operadores Numéricos

Use estes operadores para comparar números inteiros dentro dos colchetes [ ].

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 de memorização: eq = equal • ne = not equal • gt = greater than • lt = lower than • ge/le = or equal

🔤 Operadores de String (Texto)

Para comparar textos, use estes operadores. Sempre coloque variáveis entre aspas para evitar erros com strings vazias ou com espaços.

OperadorSignificado
=Strings iguais
!=Strings diferentes
-zString vazia (zero length)
-nString não vazia (non-zero)
strings.sh
# Verificar senha SENHA="abc123" if [ "$SENHA" = "abc123" ] then echo "Acesso liberado! 🔓" else echo "Senha incorreta! 🔒" fi # Verificar se campo está vazio if [ -z "$NOME" ] then echo "Nome é obrigatório!" fi

⚠️ Sempre use aspas em variáveis de texto!
[ "$VAR" = "valor" ]    ❌ [ $VAR = valor ]
Sem aspas, uma variável vazia quebra a sintaxe do teste.

📁 Operadores de Arquivo

Esses operadores testam propriedades de arquivos e diretórios — essenciais para scripts que manipulam o sistema de arquivos com segurança.

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 echo "Arquivo existe! Fazendo backup..." cp "$ARQUIVO" backup/ else echo "Arquivo não encontrado! ❌" fi # Criar pasta se não existir 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.

🔧 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
Crie notas.sh com if/elif/else que classifica uma nota: ≥70 "Aprovado", ≥50 "Recuperação", caso contrário "Reprovado". Teste com três valores diferentes.
2
Teste operadores de arquivo
Crie checa_arquivo.sh que recebe um caminho e verifica: se é arquivo (-f), se é diretório (-d) ou se não existe (-e negado). Use read -p para pedir o caminho.
3
Script com operadores lógicos
Crie acesso.sh que pergunta usuário e senha. Use -a (AND) para só liberar acesso se os dois valores estiverem corretos. Teste com credenciais certas e erradas.
4
Verificador de sistema com exit code
Crie verifica_servico.sh que usa if systemctl is-active nginx (sem [ ]) para checar se o nginx está ativo. Se estiver, mostre "OK"; senão, mostre "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.