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

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

Re: [shell-script] RES: Curiosidade sobre comando IF " disfarç ado"


From: Clovis Fabricio Costa
Subject: Re: [shell-script] RES: Curiosidade sobre comando IF " disfarç ado"
Date: Fri, 23 Jun 2000 13:31:55 -0300

Rodolfo Villanova wrote:
Caro amigo Rodolfo,

> Se o amigo conhece um pouco da linguagem C (sobre a qual foi programado o
> próprio sistema operacional Unix e seus diversos sabores), deve com certeza
> saber que o operador lógico "&&" tem precedência de execução em relação ao
> operador lógico "||", não importando qual esteja mais à esquerda na linha de
> comando.

Certo. mas nao estamos programando em C. Isto aqui eh SHELL SCRIPT. Nao
tem compilador. A linguagem é interpretada e executada.
Veja só, tirei do info bash:

   Lists
       A list is a sequence of one or more pipelines separated by
       one of the operators ;,  &,  &&,  or  ||,  and  optionally
       terminated by one of ;, &, or <newline>.

       Of  these list operators, && and || have equal precedence,
       followed by ; and &, which have equal precedence.

Ali mesmo diz que && e || tem precedencia IGUAL.

> Assim, o uso dos parênteses serve para alterar a precedência de avaliação
> pelo compilador (da esquerda para a direita, mas as expressões com
> operadores AND precedem as com operadores OR).

Em shell, os parenteses nao servem pra isso. Em shell, os parenteses sao
pros comandos compostos:

       (list) list   is   executed   in   a  subshell.   Variable
              assignments and builtin commands  that  affect  the
              shell's  environment  do not remain in effect after
              the command completes.  The return  status  is  the
              exit status of list.

Ou seja, uma nova instancia do shell é carregada pra executar o que está
entre parenteses.

> Por outro lado, se olharmos com maior atenção à questão abordada, veremos
> (pelo menos me parece) que o shell (pelo menos nesse caso) subverte essa
> ordem de avaliação de expressões lógicas, normalmente seguida na arquitetura
> das linguagens computacionais.

Nao só neste caso, mas em TODOS os casos, como voce pode ver de acordo
com o trecho do manual acima.

> Era somente essa a reflexão que desejei compartilhar com os leitores, mais
> nada.
> Também estou aqui para aprender e compartilhar o pouco que domino.

Eu tambem. Chego a conclusao de que os simbolos (, ), && e || nada tem a
ver com seus equivalentes em C, e não devem ser tratados como tal, pois
script é diferente de C.

Alias, em C, 0 é falso, no bash, 0 é verdadeiro!!!! Procê ver as
diferenças!

> Ao referido amigo da lista que respondeu-me a questão informo que nos
> ambientes Sun Solaris e HP-UX ainda não há uma versão do "Born Alive" Shell,
> e que ainda não foi precisei realizar qualquer tipo de doação para
> compreender algo.

Bom, o sh funciona praticamente igual, com poucas diferencas... Mas acho
que se voce pegar o GNU Bash e compilar, ele funciona, nao funciona?
Nunca testei, nao tenho Solaris nem HP-UX aqui...

> Bom fim-de-semana a todos.
> Rodolfo

A voce tambem.
Clovis

> > Bom. O comando if, executa o then se o resultado FOR ZERO, e executa o
> > else SE FOR DIFERENTE DE ZERO.
> > Por isso utilizamos o comando "test" ([) para fazer os testes dele. Este
> > comando test (digite help test) pode ser abreviado como colchetes, e
> > retorna 0 quanto é verdadeiro.
> > Já a execução de programas com || e && é completamente diferente. Não
> > tem comando test.
> > Os operadores && e || são operadores para lista de comandos.
> > O AND (&&) so eh verdadeiro se ambos forem verdadeiros, ou seja, se
> > executar o primeiro e der falso (diferente de zero) ele nem executa o
> > segundo.
> > Ja o OR (||) so eh falso se ambos forem falsos, por isso, se o primeiro
> > der verdadeiro (zero) ele nem executa o segundo.
> > Estes operadores tem precedencia igual, ou seja, nao sao como os
> > operadores -a e -o do comando test.
> > Deu pra entender? Qq duvida pergunta ai (ou le o info bash) hehehe
> > Clovis


reply via email to

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