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, elif e else. Isso ajuda a visualizar a hierarquia.
  • Quebras de linha: Coloque then na mesma linha do if com 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 a e b, use idade e salario.

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

Exercícios

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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