você está aqui: Home → Colunistas → Cantinho do Shell
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