você está aqui: Home → Arquivo de Mensagens
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:
#!/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
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.
#!/bin/bash if test -d dir then >a; >b; >c ls -l else mkdir dir cd dir >a; >b; >c ls -l fi pwd
Neste caso, utilizei o comando test
que serve para testar condições. Além das
condições tradicionais (maior, menor, igual, diferente, maior-ou-igual,
...) este comando 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 comando 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
#!/bin/bash cd dir 2> /dev/null || { mkdir dir cd dir } >a; >b; >c ls -l pwd
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.