De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.
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!
This policy contains information about your privacy. By posting, you are declaring that you understand this policy:
This policy is subject to change at any time and without notice.
These terms and conditions contain rules about posting comments. By submitting a comment, you are declaring that you agree with these rules:
Failure to comply with these rules may result in being banned from submitting further comments.
These terms and conditions are subject to change at any time and without notice.
Comentários