Algumas novidades do Bash 4.0, por Julio Neves: terminadores do case
O Julio Neves, uma das referências nacionais sobre shell script, autor de obras sobre o assunto e instrutor frequente em cursos sobre Bash e Zenity, enviou o artigo abaixo sobre algumas das novidades trazidas na versão 4 do Bash, que publico na íntegra com os agradecimentos ao mestre!
Algumas novidades do Bash 4.0: terminadores do case
Por Julio Neves
O 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).
$ 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
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