você está aqui: Home  → Arquivo de Mensagens

Formas de if

Colaboração: Júlio Neves

Data de Publicação: 01 de Julho de 2003

O Júlio Cezar, autor do melhor livro de programação shell que conheço :-) me enviou alguns comentários a respeito de uma dica que escrevi com base em uma palestra dele que assisti no IV Fórum Internacional de Software Livre, em Porto Alegre.

O livro de Programação Shell do Júlio pode ser encontrado em http://www.brasport.com.br/livro.asp?Cod=85-7452-118-3

Gostaria de agradecer ao Júlio por compartilhar seus grandes conhecimentos e seu eterno bom humor conosco :-)

A seguir, a mensagem do Júlio:


Formas de if

Júlio Cezar Neves

Como eu havia te prometido ai vai uma série de formas de executar a mesma tarefa:

- Forma 1 -

  #!/bin/bash
  if  cd dir 2> /dev/null
  then
      >a; >b; >c
      ls -l
  else
      mkdir dir
      cd dir
      >a; >b; >c
      ls -l
  fi
  pwd

Observações da Forma 1:

Neste exemplo, tirei partido da característica do comando if que diferentemente dos ifs das linguagens tradicionais não testa uma condição, mas sim a instrução a ele associada, isto é, caso o cd seja bem sucedido (e o será se já existir o diretório dir), a seqüência do programa será pelo then, caso contrário pelo else.

Repare que neste script não usei o touch, usei o redirecionamento da saída padrão (>) para criar os arquivos (a, b e c) sem onerar o kernel, ganhando na execução. O ponto-e-vírgula serve para colocar mais de um comando na mesma linha.

O pwd ao final foi colocado para mostrar que o ls foi feito de dentro do diretório dir, pois qdo termina a execução do script (que estava sendo executado em um sub-shell) vc estará novamente no diretório do shell pai. Se vc executar somente do if ao fi no prompt de comando, ele permanecerá em dir pq não foi criado um sub-shell.

- Forma 2 -

  #!/bin/bash
  if  test -d dir
  then
      >a; >b; >c
      ls -l
  else
      mkdir dir
      cd dir
      >a; >b; >c
      ls -l
  fi
  pwd

Observações da Forma 2:

Neste caso, utilizei o cmd test que serve para testar condições. Além das condições tradicionais (maior, menor, igual, diferente, maior-ou-igual, ...) este cmd também possui diversas opções para testar arquivos e diretórios (neste caso, a opção -d foi usada para verificar se havia um diretório dir definido).

Observe que o if continua testando a execução de uma instrução, no caso o test.

Como esta construção é muito feia e xquisita, foi implementado um alias para o cmd test, que consiste em colocar o escopo da instrução entre um par de colchetes, embelezando e tornando a leitura mais fácil. Assim sendo, o script abaixo é exatamente igual ao anterior, e por isso não será chamado de forma 3.

  #!/bin/bash
  if  [ -d dir ]
  then
      >a; >b; >c
      ls -l
  else
      mkdir dir
      cd dir
      >a; >b; >c
      ls -l
  fi
  pwd
  • Forma 3 -
      #!/bin/bash
      cd dir 2> /dev/null ||
      {
          mkdir dir
          cd dir
      }
      >a; >b; >c
      ls -l
      pwd
    

    ==Observações da Forma 3:==

    Neste caso uma construção maluca! Vejam só a criatividade que o shell permite! O conector || significa um ou lógico (o e lógico é &&), então como sabemos que verdadeiro ou qualquer coisa (falso, verdadeiro) resultará em verdadeiro, a otimização do shell qdo encontra verdadeiro, não executa o que segue o ou. Ao contrário, se o primeiro membro for falso o segundo será executado. Desta forma, caso não haja o diretório dir (o cd dir resultará falso), o conector || fará com que o bloco de programa entre as chaves ({}) seja executado.


Veja a relação completa dos artigos de Júlio Neves

 

 

Opinião dos Leitores

Seja o primeiro a comentar este artigo
*Nome:
Email:
Me notifique sobre novos comentários nessa página
Oculte meu email
*Texto:
 
  Para publicar seu comentário, digite o código contido na imagem acima
 


Powered by Scriptsmill Comments Script