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: Julio Cezar Neves
Data de Publicação: 30 de setembro de 2019
O bash 4.0 introduziu duas novas facilidades no comando case
. A partir desta
versão, existem mais dois terminadores de bloco além do ;;,
que são:
;;& |
Quando um bloco de comandos for encerrado com este terminador, o programa não sairá do case , mas testará os próximos padrões; |
;& |
Neste caso, o próximo bloco será executado, sem sequer testar o seu padrão. |
Exemplo
Suponha que no seu programa possam ocorrer 4 tipos de erro e você resolva representar cada um deles por uma potência de 2, isto é 20=1, 21=2, 22=4, 23=8, de forma que a soma dos erros ocorridos gerem um número único para representá-los (é assim que se formam os números binários). Assim, se ocorrem erros dos tipos 1 e 4, será passado 5 (4+1) para o programa, se os erros forem 1, 4 e 8, será passado 13 (8+4+1). Observe a tabela a seguir:
Soma | Erros | |||
8 | 4 | 2 | 1 | |
8 | x | - | - | - |
7 | - | x | x | x |
6 | - | x | x | - |
5 | - | x | - | x |
4 | - | x | - | - |
3 | - | - | x | x |
2 | - | - | x | - |
1 | - | - | - | x |
0 | - | - | - | - |
$ cat case.sh
#!/bin/bash
# Recebe um código formado pela soma de 4 tipos
#+ de erro e dá as msgs correspondentes. Assim,
#+ se houveram erros tipo 4 e 2, o script receberá 6
#+ Se os erros foram 1 e 2, será passado 3. Enfim
#+ os códigos de erro seguem uma formação binária.
Bin=$(bc <<< "obase=2; $1") Passa para binário
Zeros=0000
Len=${#Bin} Pega tamanho de $Bin
Bin=${Zeros:$Len}$Bin Preenche com zeros à esquerda
# Poderíamos fazer o mesmo que foi feito acima
#+ com um cmd printf, como veremos no capítulo 6
case $Bin in
1[01][01][01]) echo Erro tipo 8;;&
[01]1[01][01]) echo Erro tipo 4;;&
[01][01]1[01]) echo Erro tipo 2;;&
[01][01][01]1) echo Erro tipo 1;;&
0000) echo Não há erro;;&
*) echo Binário final: $Bin
esac
Repare que todas as opções serão testadas para saber quais são bits ligados (zero=desligado, um=ligado). No final aparece o binário gerado para que você possa comparar com o resultado. Testando:
$ case.sh 5 Erro tipo 4 Erro tipo 1 Binário final: 0101 $ case.sh 13 Erro tipo 8 Erro tipo 4 Erro tipo 1 Binário gerado: 1101
Veja também este fragmento de código adaptado de http://tldp.org/LDP/abs/html/bashver4.html.
case "$1" in [[:print:]] ) echo $1 é um caractere imprimível;;& # O terminador ;;& testará o próximo padrão [[:alnum:]] ) echo $1 é um carac. alfa/numérico;;& [[:alpha:]] ) echo $1 é um carac. alfabético ;;& [[:lower:]] ) echo $1 é uma letra minúscula ;;& [[:digit:]] ) echo $1 é um caractere numérico ;& # O terminador ;& executará o próximo bloco... %%%
@ ) echo "************************" ;; # ... mesmo com um padrão maluco. esac
Sua execução passando 3
resultaria:
3 é um caractere imprimível
3 é um carac. alfa/numérico
3 é um caractere numérico
********************************
Passando m
:
m é um caractere imprimível
m é um carac. alfa/numérico
m é um carac. alfabético
m é uma letra minúscula
Passando /
:
/ é um caractere imprimível
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