case/esacAula 10 — Múltiplas escolhas de forma elegante: padrões, wildcards e menus interativos em Shell Script
case?O case é uma alternativa ao if/elif/else quando se precisa comparar uma variável com muitos valores diferentes. É mais legível, organizado e fácil de manter do que uma cadeia longa de elif.
| Elemento | Significa |
|---|---|
case | Inicia a estrutura |
in | "Em qual desses padrões se encaixa?" |
) | Finaliza a declaração do padrão |
;; | Encerra o bloco de comandos daquele caso |
esac | Fecha a estrutura (case ao contrário!) |
💡 Quando usar? 4 ou mais opções • menus interativos • classificar valores por padrão • interpretar exit codes. Para 2–3 condições simples, o if/else continua sendo mais direto.
1) → executa bloco e para no ;;*)📌 O *) é a rede de segurança: captura qualquer valor que não tenha sido previsto nos casos anteriores. Sempre coloque-o por último — se vier antes, impede que os outros casos executem.
O case não compara apenas valores exatos — ele trabalha com padrões, similar ao globbing do bash.
| Padrão | Combina com… | Exemplo |
|---|---|---|
valor | Valor literal exato | 1) → só "1" |
* | Qualquer coisa (0 ou + chars) | *) → tudo |
? | Exatamente um caractere | ?) → "a", "1", "@" |
[0-9] | Um dígito (0 a 9) | [0-9]) → "3" |
[A-Z] | Uma letra maiúscula | [A-Z]) → "B" |
[a-z] | Uma letra minúscula | [a-z]) → "k" |
*.txt | Qualquer coisa terminando em .txt | *.sh) → "run.sh" |
a|b|c | a OU b OU c | s|S|sim) |
⚠️ [0-9] captura apenas um dígito. Para detectar números de vários algarismos, use [0-9]* (um dígito seguido de qualquer coisa).
|O | funciona como OU dentro de um padrão: o caso executa se a variável combinar com qualquer das alternativas.
Com isso, o usuário pode digitar sim, SIM, s, S, yes ou y — todos caem no mesmo bloco. Sem o |, seria necessário um elif para cada um.
💡 Essa técnica é muito usada em scripts de instalação e configuração para aceitar confirmações em diferentes formatos, tornando o script mais robusto.
Salve o exit code em $? logo após o comando e use o case para tratar cada resultado possível.
⚠️ Salve $? imediatamente! Qualquer comando executado entre o programa e o case sobrescreve o valor de $?. Atribua a uma variável na linha seguinte ao comando.
case quando…if quando…-gt, -le)-f, -d)📌 Regra de ouro: "Comparando uma variável com muitos valores fixos?" → use case. Os dois se complementam: use case para escolher a ação principal e if para validações dentro de cada caso.
caseRelacione cada elemento do case à sua função.
case (palavra-chave final).shesac
;;
*)
[0-9]
a|b|c
*.sh
menu.sh com 4 opções (listar, criar, remover, sair) usando case. O caso *) deve exibir as opções válidas. Teste com opções válidas e inválidas.confirmar.sh que aceite sim, SIM, s, S como confirmação e nao, n, N como negação usando o operador |. Tire screenshot dos testes.tipo.sh que recebe o nome de um arquivo e usa *.ext para identificar: imagem (jpg/png), áudio (mp3/wav), script (.sh) e tipo desconhecido. Teste com pelo menos 5 arquivos diferentes.ping.sh que faça ping -c 1 em um host digitado pelo usuário, capture o exit code em $? e use case para exibir: "Acessível" (0), "Sem resposta" (1) ou "Erro" (*).case transforma um encadeamento confuso de elif em algo legível e fácil de manter. Menus interativos são um dos usos mais comuns em scripts de administração de sistemas Linux.
Qual a vantagem da estrutura case sobre múltiplos if/elif?
case é ideal para comparar uma variável com múltiplos padrões — código mais limpo e organizado que encadeamentos de if/elif.O que representa o padrão *) em uma estrutura case?
*) é o padrão coringa — funciona como o else do if, capturando qualquer valor que não combinou com os padrões anteriores.O que o duplo ponto-e-vírgula (;;) indica em uma estrutura case?
;; finaliza o bloco de cada caso, equivalente ao break em outras linguagens. Sem ele, Bash pode cair no próximo caso.Como criar um menu interativo combinando case com while?
while true; do read opcao; case $opcao in 1) .;; q) break;; esac; done — menu que repete até o usuário sair.