Comparações
Esta aula aborda comparações em Shell Script, incluindo numéricas, de strings e de arquivos, além de como combiná-las com operadores lógicos. O conteúdo é prático e progressivo, com exemplos de código e exercícios resolvidos.
Comparações são fundamentais em qualquer linguagem de programação, e no Shell Script não é diferente. Elas permitem que seus scripts tomem decisões baseadas em condições, como verificar se um número é maior que outro, se duas strings são iguais, ou se um arquivo existe. Nesta aula, vamos explorar os operadores de comparação numérica, de strings e de arquivos, além de aprender a combiná-los para criar condições mais complexas.
Entender esses operadores é essencial para construir scripts robustos e flexíveis. Utilizaremos o comando test e sua forma abreviada com colchetes [ ] para realizar as comparações. Vamos mergulhar em cada tipo de comparação com exemplos práticos.
Numéricas (-eq, -lt)
As comparações numéricas são usadas para comparar números inteiros. Os operadores mais comuns são: -eq (igual), -ne (diferente), -lt (menor que), -le (menor ou igual), -gt (maior que), -ge (maior ou igual).
Exemplo: verificar se a idade é maior ou igual a 18.
#!/bin/bash
idade=20
if [ $idade -ge 18 ]; then
echo "Maior de idade"
else
echo "Menor de idade"
fiOutro exemplo: comparar dois números.
#!/bin/bash
a=10
b=20
if [ $a -lt $b ]; then
echo "$a é menor que $b"
fiÉ importante notar que esses operadores funcionam apenas com números inteiros. Para números de ponto flutuante, seria necessário usar ferramentas como bc ou awk.
Strings (=, !=)
Para comparar strings, usamos = para igualdade e != para diferença. Também existem operadores como -z (string vazia) e -n (string não vazia).
Exemplo: verificar se o nome do usuário é "admin".
#!/bin/bash
usuario="admin"
if [ "$usuario" = "admin" ]; then
echo "Acesso permitido"
else
echo "Acesso negado"
fiSempre coloque as variáveis entre aspas duplas para evitar problemas com espaços ou caracteres especiais. Exemplo com !=:
#!/bin/bash
senha="1234"
if [ "$senha" != "1234" ]; then
echo "Senha incorreta"
fiPara verificar se uma string é vazia:
#!/bin/bash
nome=""
if [ -z "$nome" ]; then
echo "Nome não fornecido"
fiArquivos (-f, -d, -e)
O Shell Script oferece vários operadores para testar atributos de arquivos. Os mais comuns são: -e (arquivo existe), -f (arquivo regular existe), -d (diretório existe), -r (tem permissão de leitura), -w (tem permissão de escrita), -x (tem permissão de execução).
Exemplo: verificar se um arquivo existe e é regular.
#!/bin/bash
arquivo="/etc/passwd"
if [ -f "$arquivo" ]; then
echo "Arquivo existe"
else
echo "Arquivo não encontrado"
fiVerificar se um diretório existe:
#!/bin/bash
diretorio="/home/usuario"
if [ -d "$diretorio" ]; then
echo "Diretório existe"
else
echo "Diretório não encontrado"
fiVerificar se um arquivo ou diretório existe (qualquer tipo):
#!/bin/bash
caminho="/tmp/teste"
if [ -e "$caminho" ]; then
echo "Caminho existe"
fiCombinando
Podemos combinar múltiplas condições usando operadores lógicos: && (AND), || (OR) e ! (NOT). Eles podem ser usados dentro de um único test ou entre comandos.
Exemplo: verificar se o usuário é root E se o arquivo existe.
#!/bin/bash
if [ "$(whoami)" = "root" ] && [ -f "/etc/shadow" ]; then
echo "Acesso root e arquivo existe"
fiUsando OR:
#!/bin/bash
if [ "$1" = "--help" ] || [ "$1" = "-h" ]; then
echo "Uso: script [opções]"
fiUsando NOT:
#!/bin/bash
if [ ! -d "/tmp/backup" ]; then
mkdir /tmp/backup
fiTambém podemos usar o comando [[ ]] (no Bash) que oferece mais recursos, como expressões regulares e operadores && e || dentro dos colchetes:
#!/bin/bash
if [[ "$1" =~ ^[0-9]+$ ]] && [ "$1" -gt 10 ]; then
echo "Número maior que 10"
fiCombinar comparações de tipos diferentes é comum e muito útil. Lembre-se de usar parênteses para agrupar condições quando necessário, embora no Bash isso seja feito com [[ ]] ou com sub-shells.
Boas práticas
Sempre coloque variáveis entre aspas duplas em comparações de strings e ao testar arquivos para evitar erros com espaços. Prefira [[ ]] em scripts Bash para maior flexibilidade. Use nomes de variáveis descritivos e comente seu código para facilitar a manutenção.
Referências
- GNU Bash Manual: Conditional Expressions
- Advanced Bash-Scripting Guide: Comparison Operators
- test man page
- Bash scripting cheatsheet
- ShellCheck - find bugs in your shell scripts
Exercícios
Escreva um script que verifica se um número fornecido como argumento é par (use operador módulo %).
✓ Resposta:#!/bin/bash if [ $(( $1 % 2 )) -eq 0 ]; then echo "Par" else echo "Ímpar" fiEscreva um script que verifica se o arquivo passado como argumento existe e é legível.
✓ Resposta:#!/bin/bash if [ -f "$1" ] && [ -r "$1" ]; then echo "Arquivo existe e é legível" else echo "Arquivo não existe ou não é legível" fiEscreva um script que compara duas strings fornecidas como argumentos e imprime se são iguais ou diferentes.
✓ Resposta:#!/bin/bash if [ "$1" = "$2" ]; then echo "Iguais" else echo "Diferentes" fiEscreva um script que verifica se um número está entre 10 e 20 (inclusive).
✓ Resposta:#!/bin/bash if [ "$1" -ge 10 ] && [ "$1" -le 20 ]; then echo "Entre 10 e 20" else echo "Fora do intervalo" fiEscreva um script que verifica se o diretório atual é /tmp e se o usuário é root.
✓ Resposta:#!/bin/bash if [ "$(pwd)" = "/tmp" ] && [ "$(whoami)" = "root" ]; then echo "Estamos em /tmp como root" else echo "Condição não satisfeita" fi