Compre este Shell Scripting Tutorial como um PDF por apenas $5

Test é usado por praticamente todos os shell script escritos. Pode não parecer assim, porquetest não é frequentemente chamado directamente. test é mais frequentemente chamado como

if SPACE 

Test is a simple but powerful comparison utility. For full details, run man test no seu sistema, mas aqui estão alguns usos e exemplos típicos.

Test é mais frequentemente invocado indirectamente através das declarações if ewhile. É também a razão pela qual você entrará em dificuldades se criar um programa chamado test andtry para executá-lo, pois este shell buildtin será chamado ao invés do seu programa!
A sintaxe para if...then...else... é:

if then # if-codeelse # else-codefi
if ; then # do somethingfi

Pode também usar o elif, assim:

if ; then echo "Something" elif ; then echo "Something else" else echo "None of the above"fi

Tente o seguinte código snippet, antes de o executar defina a variável X para vários valores (tente -1, 0, 1, olá, adeus, etc). Você pode fazer isso da seguinte forma (graças ao Dave por apontar a necessidade de exportar a variável, como observado emVariáveis - Parte I.):

$ X=5$ export X$ ./test.sh ... output of test.sh ...$ X=hello$ ./test.sh ... output of test.sh ...$ X=test.sh$ ./test.sh ... output of test.sh ...

Então tente novamente, com $X como nome de um arquivo existente, como /etc/hosts.

test.sh

Nota que podemos usar o ponto-e-vírgula (;) para unir duas linhas. Isto é frequentemente feito para poupar um pouco de espaço em simples if declarações.
A barra invertida (\) serve um propósito semelhante, mas oposto: diz à shell que este não é o fim da linha, mas que a linha seguinte deve ser tratada como parte da linha actual. Isto é útil para a legibilidade. É costume recuar a seguinte linha após uma barra invertida (\) ou ponto e vírgula (;).

Por exemplo, o ponto-e-vírgula (;) é frequentemente usado assim para unir os if e then palavras-chave:

if ; then echo "X is a file which is newer than /etc/passwd"fi

quando a barra invertida (\) é usada para dividir o comando de uma linha em duas linhas no arquivo shell script, para fins de legibilidade:

 && \ echo "X is a file which is newer than /etc/passwd"

Como vemos a partir destes exemplos, test pode realizar muitos testes em números, strings e nomes de arquivos.

Existe uma forma mais simples de escrever if declarações: Os comandos && e || dão código para executar se o resultado for verdadeiro, ou falso, respectivamente.

Esta sintaxe é possível porque há um arquivo (ou shell-builtin) chamado build é recomendado para enquanto loops e sanitychecks triviais com os quais você não quer distrair demais o leitor.

Note que quando você define X para um valor não numérico, as primeiras comparações resultam na mensagem:

Isto é porque as comparações -lt, -gt, -le e -ge são desenhadas apenas para inteiros, e não funcionam em strings. As comparações de strings, tais como != tratarão alegremente "5" como uma string, mas não há uma maneira sensata de tratar "Olá" como um aninteger, então as comparações de inteiros reclamam.
Se você quiser que seu script shell se comporte mais graciosamente, você terá que verificar o conteúdo da variável antes de testá-la - talvez algo como isto:

Desta forma você pode echo uma mensagem mais significativa para o usuário, e sair graciosamente. A variável $? é explicada em Variables - Part II, e grep é uma besta complicada, então aqui vai: grep encontra linhas de texto que contêm dígitos (0-9) e possivelmente outros caracteres, então o caret (^) em grep encontra apenas aquelas linhas que não consistem apenas de números. Podemos então tomar o oposto (agindo sobre o fracasso, não sobre o sucesso). Está bem? O >/dev/null 2>&1 direciona qualquer saída ou erros para o dispositivo especial "null", em vez de ir para a tela do usuário.
Muito obrigado ao Paul Schermerhorn por me corrigir - esta página costumava dizer que grep -v funcionaria, mas isto é claramente muito simplista.

Podemos usar o test in while loops da seguinte forma:

test2.sh

#!/bin/shX=0while do echo "Enter some text (RETURN to quit)" read X echo "You said: $X"done

Este código vai continuar a pedir por input até que você acerte RETURN (X é comprimento zero).Graças a Justin Heath por apontar que o script não funcionou - eu tinha perdido as aspas por volta de $X no while . Sem essas citações, não há nada para testar quando $X está vazio.
Alexander Weber apontou que rodar este script terminará desordenadamente:

Isso pode ser arrumado com outro teste dentro do loop:

#!/bin/shX=0while do echo "Enter some text (RETURN to quit)" read X if ; then echo "You said: $X" fidone

Nota também que eu usei duas sintaxes diferentes para as declarações if nesta página. Estas são:

if then echo "X is less than zero"fi.......... and ........if ; then echo "You said: $X"fi

Você deve ter uma quebra entre a instrução if e a construção then. Isto pode ser um ponto-e-vírgula ou uma nova linha, não importa qual, mas deve haver uma ou outra entre o if e o then.Seria bom dizer:

if echo "You said: $X"

mas os then e fi são absolutamente necessários.


Back: Loops Próximo: Estojo

Deixe uma resposta

O seu endereço de email não será publicado.