você está aqui: Home  → Arquivo de Mensagens

"case" em bash

Colaboração: Rodrigo Bernardo Pimentel

Data de Publicação: 20 de Setembro de 2000

Quando se quer testar uma série de condições, pode-se usar "if", "elif" e "else", como já veiculado em outra dica. Porém, quando o teste é para um mesmo valor de variável, a repetição pode-se tornar inconveniente:

  if [ "$REPOSTA" = "sim" ]; then
          faz_coisas
  
  elif [ "$RESPOSTA" = "nao"]; then
          exit 0
  
  elif [ "$RESPOSTA" = "depende_do_tempo" ]; then
          faz_coisas_se_o_tempo_permitir
  
  elif [ "$RESPOSTA" = "depende_do_humor" ]; then
          faz_coisas_se_o_humor_permitir
  
    ...
  

E por aí vai. As checagens são necessárias, afinal de contas precisamos reagir diferentemente a cada uma das condições. Mas a repetição de 'elif [ "$RESPOSTA" = "..."]; then' torna-se cansativa.

Para esse tipo de problema, existe uma construção em bash chamada "case" (existe também em outras linguagens como C). Sua estrutura é:

  case "$variavel"in
          primeira_opcao)
                  comando1
                  comando2
                  ...
                  ;;
  
          segunda_opcao)
                  outro_comando
                  ainda_outro
                  ...
                  ;;
          ...
  
          *)
                  ultimo_comando
  
  esac

Isso testa "$variavel" com cada uma das opções. Quando achar uma adequada, executa os comandos até ";;" e sai do loop (não tenta outras opções mais adiante). O nosso exemplo com "if" acima ficaria:

  case "$RESPOSTA" in
          sim)
                  faz_coisas
                  ;;
  
          nao)
                  exit 0
                  ;;
  
          depende_do_tempo)
                  faz_coisas_se_o_tempo_permitir
                  ;;
  
          depende_do_humor)
                  faz_coisas_se_o_humor_permitir
                  ;;
  
          *)
                  echo 'NDA!'
  
  esac

Notem que "*" é um "catchall", ou seja, se o valor da variável "RESPOSTA" não for "sim", "nao", "depende_do_tempo" ou "depende_do_humor", serão executandos os comandos após o "*)" (que não precisa terminar em ";;").

Normalmente, os scripts de inicialização do sistema (em /etc/init.d ou /etc/rc.d/init.d, dependendo da distribuição) necessitam de um parâmetro, um dentre "start", "stop", "status", "restart" ou "reload" (às vezes mais). A situação ideal para se usar um "case", certo? O pessoal das distribuições também acha. Portante, se você quiser exemplos de "case", procure nos scripts de inicialização da sua distribuição!

   _____________________________________________________________________________
   Rodrigo Bernardo Pimentel <rbp@sp.conectiva.com.br>|  GPG KeyID: 0x81F85A48
   LinuxSP                 <http://www.linuxsp.org.br>|      Fingerprint:    
   AirGeeks                  <http://www.airgeeks.org>|7E62 9CA2 C95B FC86 B334
   ___________<http://www.conectiva.com.br>___________|203E C011 2E4D 81F8 5A48
   If both chutes fail, track for your rigger!


Veja a relação completa dos artigos de Rodrigo Bernardo Pimentel

 

 

Opinião dos Leitores

Bruno
22 Set 2015, 16:01
otimo artigo!! me ajudou muito
*Nome:
Email:
Me notifique sobre novos comentários nessa página
Oculte meu email
*Texto:
 
  Para publicar seu comentário, digite o código contido na imagem acima
 


Powered by Scriptsmill Comments Script