Visite também: Currículo ·  Efetividade BR-Mac

O que é LinuxDownload LinuxApostila LinuxEnviar notícia


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


• Publicado por Augusto Campos em 2011-02-22

Comentários dos leitores

Os comentários são responsabilidade de seus autores, e não são analisados ou aprovados pelo BR-Linux. Leia os Termos de uso do BR-Linux.

Este post é antigo (2011-02-22) e foi arquivado. O envio de novos comentários a este post já expirou.