você está aqui: Home  → Arquivo de Mensagens Curso Gratuito sobre Expressões Regulares, com o Prof.  Julio Neves

Formas de if

Colaboração: Julio Cezar Neves

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

Aqui 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 quando termina a execução do script (que estava sendo executado em um sub-shell) você estará novamente no diretório do shell pai. Se você executar somente do if ao fi no prompt de comando, ele permanecerá em dir porque 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 quando 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 Julio Cezar Neves