Comparações são fundamentais em shell script para controlar o fluxo do programa baseado em condições. Nesta aula, você aprenderá a comparar números, strings e arquivos usando os operadores específicos do Bash, além de combinar múltiplas condições com operadores lógicos.

Entender esses operadores é essencial para escrever scripts que tomam decisões, como verificar se um arquivo existe, se um usuário tem permissão, ou se um valor atende a certos critérios. Veremos cada tipo de comparação com exemplos práticos.

Numéricas (-eq, -lt)

Comparações numéricas no Bash são feitas com operadores específicos dentro de colchetes [ ] ou [[ ]]. Os principais operadores são: -eq (igual), -ne (diferente), -lt (menor que), -le (menor ou igual), -gt (maior que), -ge (maior ou igual). Eles comparam valores inteiros.

É importante notar que esses operadores só funcionam com números inteiros. Para números de ponto flutuante, seria necessário usar ferramentas como bc ou awk. Exemplo prático:

#!/bin/bash
a=10
b=20
if [ $a -eq $b ]; then
    echo "a é igual a b"
else
    echo "a não é igual a b"
fi

if [ $a -lt $b ]; then
    echo "a é menor que b"
fi

Saída esperada: "a não é igual a b" e "a é menor que b".

Strings (=, !=)

Para comparar strings, usamos = (igual) e != (diferente) dentro de colchetes. Também existem operadores como -z (string vazia) e -n (string não vazia). As comparações são sensíveis a maiúsculas/minúsculas.

Exemplo:

#!/bin/bash
str1="hello"
str2="world"
if [ "$str1" = "$str2" ]; then
    echo "strings iguais"
else
    echo "strings diferentes"
fi

if [ -z "$str1" ]; then
    echo "string vazia"
else
    echo "string não vazia"
fi

Note o uso de aspas duplas ao redor das variáveis para evitar problemas se a string contiver espaços ou caracteres especiais.

Arquivos (-f, -d, -e)

O Bash oferece diversos operadores para testar atributos de arquivos. Os mais comuns são: -e (existe), -f (é um arquivo regular), -d (é um diretório), -r (tem permissão de leitura), -w (escrita), -x (execução), -s (tamanho maior que zero).

Exemplo:

#!/bin/bash
file="/etc/passwd"
if [ -e "$file" ]; then
    echo "O arquivo $file existe"
fi
if [ -f "$file" ]; then
    echo "É um arquivo regular"
elif [ -d "$file" ]; then
    echo "É um diretório"
fi
if [ -r "$file" ]; then
    echo "Tem permissão de leitura"
fi

Esses testes são muito usados em scripts para verificar pré-condições antes de operações.

Combinando

Você pode combinar múltiplas condições usando operadores lógicos: && (AND) e || (OR) dentro de [[ ]], ou -a e -o dentro de [ ]. O uso de [[ ]] é mais moderno e seguro, pois permite expressões regulares e evita problemas com expansão de palavras.

Exemplo:

#!/bin/bash
a=5
b=10
file="/tmp/teste.txt"

# Combinando com [[ ]]
if [[ $a -lt $b && -e "$file" ]]; then
    echo "a é menor que b e o arquivo existe"
fi

# Usando [ ] com -a
if [ $a -lt $b -a -e "$file" ]; then
    echo "mesma condição"
fi

# Usando || (OR)
if [[ $a -eq 0 || $b -eq 0 ]]; then
    echo "pelo menos um é zero"
fi

Preferencialmente, use [[ ]] para maior clareza e segurança. Você também pode aninhar estruturas condicionais para lógicas mais complexas.

Boas práticas

Sempre coloque variáveis entre aspas duplas em comparações de strings e testes de arquivo para evitar erros com espaços. Prefira [[ ]] a [ ] quando possível, pois oferece mais recursos e menos surpresas. Lembre-se de que operadores numéricos só funcionam com inteiros; para floats, use bc ou awk.

Referências

Exercícios

  1. Escreva um script que leia dois números do usuário e informe qual é o maior, ou se são iguais.

    ✓ Resposta:
    #!/bin/bash
    read -p "Digite o primeiro número: " num1
    read -p "Digite o segundo número: " num2
    
    if [ $num1 -gt $num2 ]; then
        echo "$num1 é maior que $num2"
    elif [ $num1 -lt $num2 ]; then
        echo "$num1 é menor que $num2"
    else
        echo "Os números são iguais"
    fi
  2. Crie um script que verifique se uma string fornecida pelo usuário é igual a "segredo". Se for, exiba "Acesso permitido"; caso contrário, "Acesso negado".

    ✓ Resposta:
    #!/bin/bash
    read -p "Digite a senha: " senha
    if [ "$senha" = "segredo" ]; then
        echo "Acesso permitido"
    else
        echo "Acesso negado"
    fi
  3. Escreva um script que verifique se o diretório /tmp existe e, se existir, liste seu conteúdo.

    ✓ Resposta:
    #!/bin/bash
    if [ -d "/tmp" ]; then
        echo "O diretório /tmp existe. Conteúdo:"
        ls -l /tmp
    else
        echo "/tmp não existe"
    fi
  4. Crie um script que verifique se um arquivo passado como argumento existe e é legível. Se sim, exiba seu conteúdo; caso contrário, exiba uma mensagem de erro.

    ✓ Resposta:
    #!/bin/bash
    if [ $# -eq 0 ]; then
        echo "Uso: $0 arquivo"
        exit 1
    fi
    arquivo="$1"
    if [ -f "$arquivo" ] && [ -r "$arquivo" ]; then
        cat "$arquivo"
    else
        echo "Erro: arquivo não existe ou não é legível"
    fi
  5. Escreva um script que leia três números e determine se eles podem ser lados de um triângulo (a soma de dois lados deve ser maior que o terceiro). Use combinação de comparações.

    ✓ Resposta:
    #!/bin/bash
    read -p "Digite o primeiro lado: " a
    read -p "Digite o segundo lado: " b
    read -p "Digite o terceiro lado: " c
    
    if [ $((a + b)) -gt $c ] && [ $((a + c)) -gt $b ] && [ $((b + c)) -gt $a ]; then
        echo "Os valores formam um triângulo"
    else
        echo "Não formam um triângulo"
    fi