Shell Scripting – Comando case – teste de múltiplas condições – 18

Estrutura de controle case … esac em Shell Scripting

A estrutura case … esac em Shell Scripting é usada para simplificar múltiplas verificações de valor em uma única variável. Ela funciona de maneira semelhante a uma estrutura switch em outras linguagens de programação, permitindo testar uma variável ou expressão contra diferentes padrões e executar comandos específicos com base nos resultados.

Sintaxe de case .. esac

A sintaxe da estrutura case é a seguinte:

case variável in
  padrão1)
    Comandos para o padrão1
    ;;
  padrão2)
    Comandos para o padrão2
    ;;
  *)
    Comandos para qualquer outro caso (opcional)
    ;;
esac

Onde:

  • variável: A variável ou expressão a ser testada.
  • padrão1, padrão2: Padrões que correspondem a diferentes valores possíveis da variável. Cada padrão termina com parênteses ).
  • ;;: Indica o final dos comandos para cada padrão.
  • *): Representa o “caso padrão” (opcional). Ele será executado se nenhum dos padrões anteriores corresponder.

Vejamos alguns exemplos de uso do condicional case em Shell Scripting.

Exemplo: Criar menu com comando case

Vamos criar um exemplo simples que exibe um menu e executa uma ação com base na escolha do usuário:

#!/bin/bash
echo "Escolha uma opção:"
echo "1) Exibir data"
echo "2) Exibir o diretório atual"
echo "3) Listar arquivos"
echo "4) Sair"
read -p "Digite sua escolha: " opcao
case $opcao in
  1)
    echo "Data atual: $(date)";;
  2)
    echo "Diretório atual: $(pwd)";;
  3)
    echo "Arquivos no diretório atual:"
    ls;;
  4)
    echo "Sair..."
    exit 0;;
  *)
    echo "Opção inválida!";;
esac

Neste exemplo:

  • A estrutura case verifica o valor da variável opcao.
  • Cada opção do menu (1, 2, 3, 4) corresponde a um bloco de comandos específico.
  • O caso * serve para qualquer entrada que não corresponda a uma das opções definidas, exibindo “Opção inválida!”

Vejamos mais alguns exemplos de uso do case.

Usar múltiplos padrões em um único caso

O case permite agrupar múltiplos valores para um mesmo conjunto de comandos, separando os padrões com |.

Exemplo: Verificar vogais

Neste exemplo, o script verifica se uma letra fornecida pelo usuário é uma vogal ou não.

#!/bin/bash
read -p "Digite uma letra: " letra
case $letra in
  a|A|e|E|i|I|o|O|u|U)
    echo "Você digitou uma vogal.";;
  *)
    echo "A letra digitada não é uma vogal.";;
esac

Como usar padrões com expressões regulares no case

O case em Shell Scripting também permite o uso de expressões regulares para correspondência de padrões mais complexos.

Exemplo: Verificar um valor numérico digitado

Este exemplo verifica se a entrada do usuário é um número positivo, negativo ou zero.

#!/bin/bash
read -p "Digite um número: " numero
case $numero in
  ''|*[!0-9-]*) # Verifica se a entrada não é numérica; usar aspas simples no início dessa expressão regular
    echo "Entrada inválida. Por favor, digite um número.";;
  -*) # Verifica se o número é negativo
    echo "O número é negativo.";;
  0)
    echo "O número é zero.";;
  *)
    echo "O número é positivo.";;
esac

Como funciona a expressão regular usada?

Na expressão regular usada no exemplo, temos:

: Duas aspas simples. Representa uma string vazia. Usado para capturar a situação em que o usuário não digita nada (a entrada é completamente vazia).

* antes de [!0-9-]: Permite que qualquer sequência de caracteres termine com pelo menos um caractere que não seja um número ou um sinal de menos.
Isso significa que, se houver qualquer caractere inválido na string, ela será capturada.

[!0-9-]: O […] é uma classe de caracteres, e ! no início significa negação dentro dessa classe. Já a parte [!0-9-] captura qualquer caractere que não seja um dígito (0-9) ou um sinal de menos (-).
Por exemplo, letras como a, b, ou símbolos como @, #, etc., correspondem a esse padrão.

*: (no final) Representa qualquer sequência de caracteres (incluindo nenhuma). Pode combinar desde uma string vazia até qualquer número de caracteres.

|: Representa o operador ou (alternativa lógica). Significa que o padrão será correspondido se a entrada for uma string vazia (”) ou se contiver caracteres que não sejam números ou um sinal de menos.

): Marca o final do padrão do case.

Excelente!  seguir trago alguns exercícios para você treinar mais o uso dos condicionais case..esac. As resoluções sugeridas se encontram logo após a listagem dos exercícios.

Exercícios com case … esac

1. Crie um script que exiba um menu com operações básicas (adição, subtração, multiplicação e divisão). O usuário escolhe a operação e fornece dois números. O script realiza a operação selecionada e exibe o resultado.

2. Escreva um script que peça um nome de arquivo ao usuário e exiba uma mensagem dizendo se é um diretório, um arquivo regular ou outro tipo de arquivo.

3. Crie um script que obtenha a hora atual e exiba uma saudação baseada na hora (por exemplo, “Bom dia”, “Boa tarde”, “Boa noite”).

4. Crie um script que permita ao usuário iniciar, parar ou reiniciar um serviço específico (como o serviço cron). O script deve perguntar ao usuário qual ação ele deseja realizar e executar o comando correspondente (sudo systemctl start|stop|restart cron).

5. Crie um script que peça ao usuário um nome de arquivo. Usando case, o script verifica a extensão do arquivo e exibe uma mensagem correspondente, como “Arquivo de imagem” para .jpg, “Arquivo de texto” para .txt, etc.

Resolução dos exercícios

Exercício 1: Menu de operações matemáticas

#!/bin/bash
echo "Escolha uma operação:"
echo "1) Adição"
echo "2) Subtração"
echo "3) Multiplicação"
echo "4) Divisão"
read -p "Digite sua escolha: " operacao
read -p "Digite o primeiro número: " num1
read -p "Digite o segundo número: " num2
case $operacao in
1)
  echo "Resultado: $((num1 + num2))";;
2)
  echo "Resultado: $((num1 - num2))";;
3)
  echo "Resultado: $((num1 * num2))";;
4)
  if [ "$num2" -eq 0 ]; then
    echo "Erro: Divisão por zero."
  else
    echo "Resultado: $((num1 / num2))"
  fi;;
*)
  echo "Operação inválida!";;
esac

Exercício 2: Verificar tipos de arquivos

#!/bin/bash
read -p "Digite o nome do arquivo: " arquivo
case $arquivo in
/*)
  if [ -d "$arquivo" ]; then
    echo "É um diretório."
  elif [ -f "$arquivo" ]; then
    echo "É um arquivo regular."
  else
    echo "Outro tipo de arquivo."
  fi;;
*)
  echo "Arquivo não encontrado.";;
esac

Exercício 3: Saudação baseada na hora do dia

#!/bin/bash
hora=$(date +%H)
case $hora in
  0[6-9]|1[0-1])
    echo "Bom dia!";;
  1[2-7])
    echo "Boa tarde!";;
  1[8-9]|2[0-3]|00|01|02|03|04|05)
    echo "Boa noite!";;
esac

Exercício 4: Menu de serviços do sistema

#!/bin/bash
echo "Escolha uma ação para o serviço cron:"
echo "1) Iniciar"
echo "2) Parar"
echo "3) Reiniciar"
read -p "Digite sua escolha: " acao
case $acao in
  1)
    sudo systemctl start cron
    echo "Serviço cron iniciado.";;
  2)
    sudo systemctl stop cron
    echo "Serviço cron parado.";;
  3)
    sudo systemctl restart cron
    echo "Serviço cron reiniciado.";;
  *)
    echo "Ação inválida!";;
esac

Exercício 5: Verificar extensão de arquivo

#!/bin/bash
read -p "Digite o nome do arquivo: " arquivo
case $arquivo in
  *.jpg|*.jpeg)
    echo "Arquivo de imagem.";;
  *.png)
    echo "Arquivo de imagem PNG.";;
  *.txt)
    echo "Arquivo de texto.";;
  *.sh)
    echo "Script de shell.";;
  *)
    echo "Extensão desconhecida.";;
esac

Conclusão

A estrutura case … esac permite simplificar a verificação de múltiplos valores e padrões, facilitando a criação de menus, verificações de entrada e controle de fluxo em scripts.

Usando o case, podemos tornar o código mais organizado e legível, além de lidar com diferentes opções de maneira eficiente.

Sobre Fábio dos Reis (1226 Artigos)
Fábio dos Reis trabalha com tecnologias variadas há mais de 30 anos, tendo atuado nos campos de Eletrônica, Telecomunicações, Programação de Computadores e Redes de Dados. É um entusiasta de Ciência e Tecnologia em geral, adora Viagens e Música, e estuda idiomas, além de ministrar cursos e palestras sobre diversas tecnologias em São Paulo e outras cidades do Brasil.

Escreva um comentário

Seu e-mail não será divulgado


*