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

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

Curiosidade sobre comando IF "disfarçado"


From: Rodolfo Villanova
Subject: Curiosidade sobre comando IF "disfarçado"
Date: Wed, 21 Jun 2000 17:39:39 -0300

Essa mensagem era para ser enviada ao Júlio Neves, assinante desta lista,
mas segundo o System Administrator [address@hidden] sua
caixa de e-mail deve estar com problemas:

--------------------
Your message

  To:      address@hidden
  Subject: Curiosidade sobre comando IF disfarçado
  Sent:    Wed, 21 Jun 2000 16:42:41 -0300

did not reach the following recipient(s):

Julio Cezar Neves - DISB.O on Wed, 21 Jun 2000 16:51:20 -0300
    The recipient was unavailable to take delivery of the message
        The MTS-ID of the original message is: c=BR;a=
;p=Previdencia;l=WTRJO0740006211951N2BMPASP
    MSEXCH:MSExchangeMTA:RJ:WTRJO077
-------------------

Assim, como a questão que irei colocar não é particular, e aborda a forma
como o interpretador shell executa uma expressão lógica, segue o texto.

A propósito, aos listeiros mais recentes da lista, a apostila referida no
texto a seguir é de autoria do Julio Cesar Neves, e ele mesmo enviou à lista
shell-script dois capítulos para nosso enriquecimento técnico sobre o
assunto.

------------------

Reexaminando a secção 4.3 da tua apostila, ref. ao "if disfarçado",
chamou-me a atenção as formas diferentes como o interpretador shell encara a
prioridade de avaliação das expressões com operadores lógicos. 

No caso do teste do IF "explícito" contendo os operadores lógicos, como no
último exemplo da secção 4.2.4, a expressão com o operador AND é avaliado
primeiro, e a seguir, as expressões com comandos OR, da esquerda para a
direita. 

Por isso, a necessidade da política de priorização com parênteses:

if  [  \( $sexo  -eq  1  -o  $sexo -eq 2 \)  -a  \( $nome = Joao  -o  $nome
= Maria \)  ]


Já no caso de IF "implícito" (secção 4.3), a prioridade de interpretação é
da esquerda para a direita. 
Assim, na linha que exemplificas 

[ -d "$MeuDir" ] || mkdir $MeuDir && cd $MeuDir 

por analogia não deveria ser interpretada primeiro a expressão "mkdir
$Meudir && cd $MeuDir" ? 


Se o interpretador fosse coerente, deveria ser obrigatório digitarmos a
linha assim: 

( [ -d "$MeuDir" ] || mkdir $MeuDir ) && cd $MeuDir 

O engraçado é que o resultado da execução é identico para ambas as formas de
redação da linha. 

Concordas com meu raciocínio?

Será isso uma incoerência do interpretador ou um equívoco de interpretação
(minha, não do shell...!) ? 


Rodolfo 




[Non-text portions of this message have been removed]



reply via email to

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