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