você está aqui: Home → Colunistas → Cantinho do Shell
Por Rodrigo Bernardo Pimentel
Data de Publicação: 19 de Junho de 2007
Quando se quer testar uma série de condições, pode-se usar "if", "elif" e "else". 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!
//Publicado originalmente na Dicas-L em 20 de setembro de 2000