shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] Dúvida em como usar o IF


From: Marcelo Beckmann
Subject: Re: [shell-script] Dúvida em como usar o IF
Date: Thu, 2 Sep 2004 00:05:49 -0300

On Wed, 1 Sep 2004 23:00:03 -0300, Vitor Yahoo! <address@hidden> wrote:
> Marcelo, valeu pelas dicas!!!

Opa, não tem de que, é sempre bom poder ajudar :)

> Só no caso do "or", eu queria fazer uma verificação mais ou menos assim:
> 
> Algoritmizando: Se variavel for igual a 1 ou 2 ou 3 ou 4 faça algo.
> 
> Ou seja, ao invés de fazer vários or or or or, só fazer assim:
> 
> if [ variavel -eq 1 | 2 | 3 | 4 ]; then

Hmmm... nesse caso em específico, checando por exatemente esses
valores ai, poderia ser feito algo do tipo:
if [ $variavel -ge 1 -a $variavel -le 4 ] ; then

-ge : maior ou igual
-le : menor ou igual
-a : operador AND

mas com outros valores, por exemplo, se fosse checar se a variavel tem
os valores 1, 10, 4 ou 8, por exemplo, ai essa abordagem não
funcionaria :(


> É porque eu vi isso em um Script, onde declava no início que era bash... mas
> estava nesta estrutura:
> 
> if (variavel~/1|2|3|4) {
> 
> Eu sou inexperiente em shell script, mas nunca vi o if com ( ... ) nesta
> linguagem . E esse exemplo que dei não funcionou... Já tentei várias
> variações e nada...

É, esse tipo de construção ai com bash eu nunca vi também.
Existe o csh (c shell), que pelo que ouvi falar tem muito a ver com C.
Talvez nele haja alguma construção desse tipo. Mas não posso afirmar
nada com certeza, não tenho experiência com csh.

Agora, usando a criatividade, podemos fazer algo parecido usando algum
comando auxiliar, me ocorre agora o grep.
Por exemplo, digamos que eu queira checar se a varíavel VAR possui os
valores 2, 5, 6 ou 9, e caso tenha, faça algo:

if [ $(echo $VAR | egrep -c "(2|5|6|9)" ) -eq 1 ] ; then

vamos testar aqui pra ver se rola:
[23:51:47 marcelo@cadaver marcelo]$ VAR=1
[23:51:57 marcelo@cadaver marcelo]$ [ $(echo $VAR | egrep -c
"(2|5|6|9)" ) -eq 1 ] && echo "tem" || echo "nao tem"
nao tem
[23:52:29 marcelo@cadaver marcelo]$ VAR=2
[23:52:35 marcelo@cadaver marcelo]$ [ $(echo $VAR | egrep -c
"(2|5|6|9)" ) -eq 1 ] && echo "tem" || echo "nao tem"
tem

Hmmm, funcionou.
Só mudei um pouco a construção. Explicando:
egrep : equivalente ao "grep -e", testa por expressões regulares
"(2|5|6|9)" : expressão regular que "casa" com 2, 5, 6 ou 9
-c : opção do grep que retorna o número de ocorrências
-eq 1 : teste para checar se o grep me disse que encontrou 1
ocorrência da expressão regular

Ao invés do if, usei uma forma alternativa pro teste:
comando && executa se retornar verdadeiro || executa se retornar falso

Isso equivale a:
if [ $(comando) -eq 1 ]
then
        executa se retornar verdadeiro
else
        executa se retornar falso
fi

No nosso caso, o $(comando) vai nos tar o retorno do "egrep -c ..."
Se o grep encontrar o que estamos procurando, isso vai retornar 1,
caso contrário, vai retornar 0. Ai comparamos isso com o -eq 1, e
seguimos em frente.


>
> Mais uma vez, obrigado!

Opa, não tem de que :)
Apesar de você ter me enviado o email em particular, tomo a liberdade
de enviar cópia pra lista, para que o pessoal possa aproveitar as
elucubrações, blz? :)

[]s
Marcelo Beckmann


reply via email to

[Prev in Thread] Current Thread [Next in Thread]