você está aqui: Home  → Arquivo de Mensagens Programe sua mente para aprender inglês - ebook gratuito

"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!



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