você está aqui: Home  → Arquivo de Mensagens

Duas novas facilidades no comando case

Colaboração: Julio Cezar Neves

Data de Publicação: 30 de setembro de 2019

Antes da dica de hoje, um recadinho rápido. Hoje, 30 de setembro, às 9h, abrem-se as inscrições para o curso Programação Shell Linux, com o Prof. Julio Neves.

»»» Clique aqui para saber mais


Duas novas facilidades no comando case

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


Veja a relação completa dos artigos de Julio Cezar Neves