você está aqui: Home  → Colunistas  →  Cantinho do Shell

 

Duas novas facilidades no comando case

Por Júlio Cezar Neves

Data de Publicação: 18 de Maio de 2010

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.

Exemplos

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

Recomende este artigo nas redes sociais

 

 

Veja a relação completa dos artigos desta coluna