Dicas para usar o comando de teste do Linux
Os comandos [ e test são declarações condicionais vitais durante a criação de scripts.
O comando [
, geralmente chamado de "teste", é um comando do pacote GNU Core Utils e inicia uma instrução condicional no Bash. Sua função é exatamente a mesma do comando test
. Quando você quiser executar um comando apenas quando algo for verdadeiro ou falso, use o comando [
ou test
. No entanto, há uma diferença significativa entre [
ou test
e [[
, e há uma diferença técnica entre esses comandos e as versões deles em seu shell.
[ vs comandos de teste no Linux
Os comandos [
e test
, instalados pelo pacote GNU Core Utils, executam a mesma função usando uma sintaxe ligeiramente diferente. (Você pode achar difícil pesquisar documentação usando o único caractere de colchete esquerdo, no entanto, muitos usuários acham test
mais fácil de consultar.) Bash e shells semelhantes também acontecem com possuem os comandos [
e test
integrados, e as versões integradas substituem aquelas instaladas em /usr/bin
. Em outras palavras, quando você usa [
ou test
, provavelmente não está executando /usr/bin/[
ou /usr /bin/teste
. Em vez disso, você está invocando o que é essencialmente uma função do seu shell Bash.
Você pode estar se perguntando por que [
ou test
existem em /usr/bin
. Alguns shells, como tcsh, não possuem [
e test
integrados, então se você quiser usar esses comandos nesse shell, você deve tê-los instalados como binários separados.
O resultado final é que, desde que você não receba um erro ao digitar um comando começando com [
ou test
, você terá tudo o que precisa. Quase nunca importa se o seu shell ou o diretório bin
está fornecendo os comandos.
Testando um arquivo
É comum querer saber se um arquivo existe, muitas vezes para que você possa prosseguir com alguma ação com segurança ou para evitar "superá-lo" com um arquivo de mesmo nome. Em uma sessão de shell interativa, você pode apenas verificar se o arquivo existe, mas em um script de shell, você precisa que o computador determine isso por si mesmo. A opção -e
testa se um arquivo existe, mas sua resposta aparente é a mesma de qualquer maneira.
$ touch example
$ test -e example
$ test -e notafile
$
Os comandos [
e test
são essencialmente opções. Eles emitem uma resposta true
ou false
, mas consideram ambas como sucesso. Você pode colocar isso em uso emparelhando os comandos com operadores lógicos, como &&
e ||
. O operador &&
é executado quando uma resposta é true
:
$ touch example
$ test -e example && echo "foo"
foo
$ test -e notafile && echo "foo"
$
O operador ||
é executado quando uma resposta é false
:
$ touch example
$ test -e example || echo "foo"
$ test -e notafile || echo "foo"
foo
$
Se preferir, você pode usar colchetes em vez de test
. Em todos os casos, os resultados são os mesmos:
$ touch example
$ [ -e example ] && echo "foo"
foo
$ [ -e notafile ] && echo "foo"
$
Testando tipos de arquivo
Tudo no Linux é um arquivo, então quando você pode testar a existência de um diretório com a opção -e
, da mesma forma que você testa um arquivo. No entanto, existem diferentes tipos de arquivos e, às vezes, isso é importante. Você pode usar [
ou test
para detectar uma variedade de tipos de arquivos diferentes:
-f
: arquivo normal (retornafalse
para um diretório)-d
: diretório-b
: bloco (como/dev/sda1
)-L
ou-h
: link simbólico-S
: soquete
Existem mais, mas esses tendem a ser os mais comuns.
Testando atributos de arquivo
Você também pode ver os metadados de um arquivo:
-s
: um arquivo com tamanho maior que zero-N
: um arquivo que foi modificado desde a última leitura
Você pode testar por propriedade:
-O
: um arquivo de propriedade do usuário principal atual-G
: um arquivo pertencente ao grupo primário atual
Ou você pode testar por permissões (ou modo de arquivo):
-r
: um arquivo com permissão de leitura concedida-w
: um arquivo com permissão de gravação concedida-x
: um arquivo com permissão de execução concedida-
-k
: um arquivo com o sticky bit definido
Combinando testes
Você nem sempre precisa testar apenas um único atributo. A opção -a
("e") permite agrupar vários testes, com a exigência de que todos os testes retornem como true
:
$ touch zombie apocalypse now
$ test -e zombie -a -e apocalypse -a -e now && echo "no thanks"
no thanks
Se alguma expressão falhar, o teste retornará false
:
$ touch zombie apocalypse now
$ test -e plant -a -e apocalypse -a -e now && echo "no thanks"
$
A opção -o
("ou") requer que uma expressão seja verdadeira:
$ touch zombie apocalypse now
$ test -e zombie -o -e plant -o -e apocalypse && echo "no thanks"
no thanks
Testes inteiros
Você também pode testar números inteiros. Isso não é necessariamente útil diretamente (você provavelmente sabe que 0 é menor que 1, por exemplo), mas é inestimável quando você usa variáveis em um script.
Os operadores são bastante intuitivos quando você entende o esquema:
-eq
: igual a-ne
: diferente-ge
: maior ou igual a-gt
: maior que-le
: menor ou igual a-lt
: menor que
Aqui está um exemplo simples:
$ nil=0
$ foo=1
$ test $foo -eq $nil || echo "Those are not equal."
Those are not equal.
$ test $foo -eq 1 && echo "Those are equal."
Claro, você pode combinar testes.
$ touch example
$ test $foo -ne $nil -a -e example -o -e notafile && echo "yes"
yes
Teste de teste
Os comandos [
e test
são instruções condicionais vitais durante a criação de scripts. Estas são maneiras fáceis e comuns de controlar o fluxo do seu código. Existem ainda mais testes disponíveis do que os que abordei neste artigo, portanto, se você usou Bash, tcsh, ksh ou algum outro shell, dê uma olhada na página de manual para obter todo o espectro do que esses comandos oferecem.