if, elif e else
Esta aula aborda o uso completo das estruturas condicionais if, elif e else em Shell Script. Você aprenderá a sintaxe correta, como aninhar condições e boas práticas para manter o código legível, com exemplos práticos e exercícios para fixação.
As estruturas condicionais são fundamentais em qualquer linguagem de programação, e no Shell Script não é diferente. Com if, elif e else, você pode controlar o fluxo do script baseado em condições, tornando seus programas dinâmicos e inteligentes. Nesta aula, vamos explorar a sintaxe completa, o aninhamento de condições, dicas de legibilidade e exemplos práticos para você dominar o assunto.
Estrutura completa
No Bash, a estrutura condicional básica começa com if, seguida por uma condição e a palavra-chave then. Opcionalmente, você pode adicionar elif (que é uma contração de "else if") para testar múltiplas condições, e else para capturar qualquer caso não atendido. A estrutura termina com fi (if ao contrário).
A sintaxe geral é:
if condição1; then
comandos
elif condição2; then
comandos
else
comandos
fi
Note que o ponto e vírgula (;) antes de then é necessário se você escrever if e then na mesma linha. Caso prefira, pode quebrar a linha após a condição e escrever then na linha seguinte (sem o ponto e vírgula):
if condição1
then
comandos
fi
As condições geralmente são expressões de teste usando colchetes [ ] (com espaços internos obrigatórios) ou o comando test. Exemplos de testes comuns:
[ "$a" -eq "$b" ]– igualdade numérica[ "$a" = "$b" ]– igualdade de strings[ -f "$arquivo" ]– verifica se arquivo existe[ "$x" -gt 10 ]– maior que
O elif pode ser usado quantas vezes for necessário, e o else é opcional. Lembre-se de que apenas um bloco será executado: o primeiro cuja condição for verdadeira.
Aninhamento
Você pode colocar estruturas if dentro de outras, criando aninhamento. Isso é útil quando uma condição depende de outra. A sintaxe é simples: dentro do bloco then ou else de um if externo, você escreve outro if completo.
Exemplo de aninhamento:
#!/bin/bash
idade=25
tem_carteira=true
if [ "$idade" -ge 18 ]; then
echo "Você é maior de idade."
if [ "$tem_carteira" = true ]; then
echo "Pode dirigir."
else
echo "Mas não tem carteira de motorista."
fi
else
echo "Você é menor de idade."
fi
Cuidado com aninhamentos profundos: eles podem tornar o código difícil de ler e manter. Sempre que possível, prefira usar elif para evitar muitos níveis. No entanto, há situações em que o aninhamento é a solução mais clara.
Legibilidade
Escrever código legível é essencial para manutenção e colaboração. Aqui estão algumas boas práticas para estruturas condicionais em Shell Script:
- Indentação consistente: Use 2 ou 4 espaços para indentar o conteúdo de cada bloco
then,elifeelse. Isso ajuda a visualizar a hierarquia. - Quebras de linha: Coloque
thenna mesma linha doifcom ponto e vírgula, ou na linha seguinte. Seja consistente no seu código. - Comentários: Explique condições complexas com comentários acima delas.
- Evite aninhamentos profundos: Se você tiver mais de 3 níveis, considere refatorar com funções ou usar
case(para múltiplas opções). - Use variáveis com nomes descritivos: Em vez de
aeb, useidadeesalario.
Exemplo de código bem indentado:
#!/bin/bash
nota=85
if [ "$nota" -ge 90 ]; then
echo "Conceito A"
elif [ "$nota" -ge 80 ]; then
echo "Conceito B"
elif [ "$nota" -ge 70 ]; then
echo "Conceito C"
else
echo "Conceito D"
fi
Exemplos
Vamos ver exemplos práticos que combinam os conceitos.
Exemplo 1: Verificar se um arquivo existe e se tem permissão de leitura
#!/bin/bash
arquivo="/etc/passwd"
if [ -f "$arquivo" ]; then
echo "O arquivo $arquivo existe."
if [ -r "$arquivo" ]; then
echo "E você tem permissão de leitura."
else
echo "Mas você não tem permissão de leitura."
fi
else
echo "Arquivo não encontrado."
fi
Exemplo 2: Sistema de notas com elif
#!/bin/bash
read -p "Digite a nota (0-100): " nota
if [ "$nota" -ge 90 ] && [ "$nota" -le 100 ]; then
echo "Conceito A"
elif [ "$nota" -ge 80 ]; then
echo "Conceito B"
elif [ "$nota" -ge 70 ]; then
echo "Conceito C"
elif [ "$nota" -ge 60 ]; then
echo "Conceito D"
else
echo "Conceito F"
fi
Exemplo 3: Verificar tipo de arquivo
#!/bin/bash
caminho="/home/usuario/documento.txt"
if [ -f "$caminho" ]; then
echo "É um arquivo regular."
elif [ -d "$caminho" ]; then
echo "É um diretório."
elif [ -L "$caminho" ]; then
echo "É um link simbólico."
else
echo "Tipo de arquivo desconhecido ou não existe."
fi
Boas práticas e observações finais
Sempre lembre-se de testar seus scripts com diferentes entradas para garantir que todas as condições estão sendo tratadas corretamente. Use set -x para depuração e veja como o Bash avalia cada condição. Além disso, evite usar if com comandos que retornam código de saída, pois o if avalia o código de saída (0 é verdadeiro, diferente de 0 é falso). Por exemplo:
if grep -q "padrão" arquivo.txt; then
echo "Padrão encontrado"
fi
Isso é mais conciso do que usar [ $(grep ...) ].
Referências
- GNU Bash Manual: Conditional Constructs
- Bash Beginners Guide: The if statement
- Linuxize: Bash if else Statement
- Shell Scripting Tutorial: If Statements
- DevHints: Bash scripting cheatsheet
- Ryan's Tutorials: Bash If Statements
Exercícios
-
Crie um script que solicite um número ao usuário e informe se ele é positivo, negativo ou zero.
✓ Resposta:#!/bin/bash read -p "Digite um número: " num if [ "$num" -gt 0 ]; then echo "Positivo" elif [ "$num" -lt 0 ]; then echo "Negativo" else echo "Zero" fi -
Escreva um script que verifique se um diretório existe e, se existir, liste seu conteúdo; caso contrário, crie-o.
✓ Resposta:#!/bin/bash dir="meu_diretorio" if [ -d "$dir" ]; then echo "Diretório existe. Conteúdo:" ls -l "$dir" else echo "Diretório não existe. Criando..." mkdir "$dir" fi -
Faça um script que receba dois números como argumentos e exiba o maior deles. Trate o caso de números iguais.
✓ Resposta:#!/bin/bash if [ $# -ne 2 ]; then echo "Uso: $0 num1 num2" exit 1 fi if [ "$1" -gt "$2" ]; then echo "Maior: $1" elif [ "$2" -gt "$1" ]; then echo "Maior: $2" else echo "Números iguais: $1" fi -
Crie um script que pergunte o nome de um arquivo e verifique se ele é um arquivo regular, um diretório ou outro tipo. Use elif.
✓ Resposta:#!/bin/bash read -p "Digite o caminho do arquivo: " caminho if [ -f "$caminho" ]; then echo "É um arquivo regular." elif [ -d "$caminho" ]; then echo "É um diretório." elif [ -L "$caminho" ]; then echo "É um link simbólico." else echo "Não é um arquivo regular, diretório ou link." fi -
Escreva um script que simule um sistema de login: peça usuário e senha. Se o usuário for "admin" e a senha "1234", exiba "Acesso permitido"; caso contrário, "Acesso negado". Use if aninhado ou elif.
✓ Resposta:#!/bin/bash read -p "Usuário: " usuario read -sp "Senha: " senha echo if [ "$usuario" = "admin" ]; then if [ "$senha" = "1234" ]; then echo "Acesso permitido" else echo "Senha incorreta" fi else echo "Usuário inválido" fi