Comparações
A aula aborda comparações em shell script, cobrindo operadores numéricos, de strings e de arquivos, além de como combiná-los com operadores lógicos. O conteúdo inclui exemplos práticos e exercícios para fixação.
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"
fiSaí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"
fiNote 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"
fiEsses 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"
fiPreferencialmente, 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
- GNU Bash Manual: Conditional Expressions
- Advanced Bash-Scripting Guide: Comparison Operators
- Linuxize: Bash Comparison Operators
- Shell Scripting Tutorial: Test
- Devhints: Bash Conditionals Cheatsheet
Exercícios
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" fiCrie 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" fiEscreva 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" fiCrie 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" fiEscreva 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