Skip to content

Como usar as condições de teste em um script Bash

22 de abril de 2021

Neste artigo

O Linux teste O comando compara um elemento com outro, mas é mais comumente usado em scripts de shell BASH como parte de instruções condicionais que controlam a lógica e o fluxo do programa.

Um exemplo básico

Experimente esses comandos em uma janela de terminal. teste 1 -eq 2 && echo “sim” || echo “não”

O comando acima se divide a seguir:

  • teste: O comando para realizar uma comparação
  • 1: O primeiro elemento que você vai comparar. Neste exemplo, é o número 1 mas pode ser qualquer número ou uma string entre aspas.
  • eq: O método de comparação. Nesse caso, você está testando se um valor é igual a outro.
  • 2: O elemento com o qual você está comparando o primeiro elemento. Neste exemplo, é o número 2
  • &&: Um atalho do Linux para encadear comandos, em sequência. A saída das cadeias de teste para os comandos a seguir. Um E comercial duplo é executado quando o comando que o precede tem um status de saída 0, que é uma maneira elegante de dizer que o comando não falhou.
  • eco “sim”: O comando a ser executado se a comparação for bem-sucedida. Neste caso, tudo o que estamos fazendo é pedir ao eco para imprimir a palavra “sim” na saída padrão, mas você pode executar qualquer comando aqui que seja executado se o resultado do teste for verdadeiro.
  • ||: O oposto, de certa forma, de &&; o tubo duplo só executa se o comando que o precede falhar (tem um status de saída diferente de 0).
  • echo “não”: O comando a ser executado se a comparação falhar.

Execute a partir de um prompt de shell, teste não retorna um valor para a saída padrão, apenas retorna um código de status de saída. É por isso que o encadeamento de um comando echo é necessário.

status de saída de teste

Em essência, o comando está comparando 1 a 2 e se eles corresponderem, a instrução echo “sim” será executada, exibindo “sim” e, se não corresponderem, a instrução echo “não” será executada, exibindo “não”.

Comparando Números

Se estiver comparando elementos que analisam como números, você pode usar os seguintes operadores de comparação:

  • -eq: valor 1 é igual a valor 2
  • -ge: valor 1 maior ou igual ao valor 2
  • -gt: valor 1 maior que valor 2
  • -le: valor 1 menor ou igual ao valor 2
  • -lt: valor 1 menor que valor 2
  • -um: o valor 1 não é igual ao valor 2

Testes de exemplo

teste 1 -eq 2 && echo “sim” || echo “não”

(exibe “não” na tela porque 1 não é igual a 2) teste 1 -ge 2 && echo “sim” || echo “não”

(exibe “não” na tela porque 1 não é maior ou igual a 2) teste 1 -gt 2 && echo “sim” || echo “não”

(exibe “não” na tela porque 1 não é maior que 2) teste 1 -le 2 && echo “sim” || echo “não”

(exibe “sim” na tela porque 1 é menor ou igual a 2) teste 1 -lt 2 && echo “sim” || echo “não”

(exibe “sim” na tela porque 1 é menor ou igual a 2) teste 1 -ne 2 && echo “sim” || echo “não”

(exibe “sim” na tela porque 1 não é igual a 2)

Comparando Texto

Ao comparar elementos que analisam como strings, use os seguintes operadores de comparação:

  • =: string 1 corresponde à string 2
  • ! =: string 1 não corresponde à string 2
  • -n: o comprimento da string é maior que 0
  • -z: o comprimento da string é igual a 0

Exemplos

teste “string1” = “string2” && echo “sim” || echo “não”

(exibe “não” na tela porque “string1” não é igual a “string2”) teste “string1”! = “string2” && echo “sim” || echo “não”

(exibe “sim” na tela porque “string1” não é igual a “string2”) test -n “string1” && echo “sim” || echo “não”

(exibe “sim” na tela porque “string1” tem um comprimento de string maior que zero) test -z “string1” && echo “sim” || echo “não”

(exibe “não” na tela porque “string1” tem um comprimento de string maior que zero)

Comparando Arquivos

Ao comparar arquivos, use os seguintes operadores de comparação:

  • -ef: Os arquivos têm o mesmo dispositivo e números de inode (são o mesmo arquivo)
  • -nt: O primeiro arquivo é mais recente que o segundo arquivo
  • -ot: O primeiro arquivo é mais antigo que o segundo arquivo
  • -b: O arquivo existe e é bloco especial
  • -c: O arquivo existe e é personagem especial
  • -d: O arquivo existe e é um diretório
  • -e: O arquivo existe
  • -f: O arquivo existe e é um arquivo normal
  • -g: O arquivo existe e tem o número de grupo especificado
  • -G: O arquivo existe e é proprietário pelo grupo do usuário
  • -h ou -EU: O arquivo existe e é um link simbólico
  • -k: O arquivo existe e tem seu sticky bit definido
  • -O: O arquivo existe, você é o proprietário
  • -p: O arquivo existe e é um canal nomeado
  • -r: O arquivo existe e é legível
  • -s: O arquivo existe e tem um tamanho maior que zero
  • -S: O arquivo existe e é um soquete
  • -t: O descritor de arquivo é aberto em um terminal
  • -você: O arquivo existe e o bit set-user-id está definido
  • -C: O arquivo existe e é gravável
  • -x: O arquivo existe e é executável

Exemplos

teste / caminho / para / arquivo1 -nt / caminho / para / arquivo2 && echo “sim”

(Se o arquivo1 for mais recente que o arquivo2, a palavra “sim” será exibida) teste -e / caminho / para / arquivo1 && echo “sim”

(se o arquivo1 existir, a palavra “sim” será exibida) teste -O / caminho / para / arquivo1 && echo “sim”

(se você possui o arquivo1, a palavra “sim” é exibida “)

Bloco especial: O arquivo é um dispositivo de bloco, o que significa que os dados são lidos em blocos de bytes. Geralmente, são arquivos de dispositivos, como discos rígidos.
Personagem especial: O arquivo é acionado imediatamente quando você grava nele e geralmente é um dispositivo como uma porta serial

Comparando várias condições

Até agora, tudo esteve comparando uma coisa com a outra, mas e se você quiser comparar duas condições? Por exemplo, se um animal tem quatro patas e faz “muu”, provavelmente é uma vaca. A simples verificação de quatro patas não garante que você tenha uma vaca, mas verificar o som que ela faz certamente sim. Para testar as duas condições ao mesmo tempo, use a seguinte declaração: test 4 -eq 4 -a “moo” = “moo “&& echo” é uma vaca “|| eco “não é uma vaca”

A parte chave aqui é o -uma bandeira, que significa e. Existe uma maneira melhor e mais comumente usada de realizar o mesmo teste: teste 4 -eq 4 && teste “moo” = “moo” && echo “é uma vaca” || eco “não é uma vaca”

Siga as filiais!

A ramificação do teste comando é significativo. Se o primeiro teste (4 = 4) falhar, o teste comando termina com um código de saída diferente de zero. Assim, saltamos para o símbolo de tubo duplo e “não é uma vaca” imprime na saída padrão. No entanto, se o primeiro teste for bem-sucedido e, portanto, teste resulta em um código de saída de 0, então saltamos para o primeiro e comercial duplo. A próxima declaração é outra condição de teste! Se o segundo teste falhar, novamente, saltamos para o tubo duplo e continuamos a partir daí. Se, no entanto, o segundo teste for bem-sucedido, saltamos para a segunda instrução “e” comercial duplo, que neste exemplo apenas ecoa “é uma vaca” para a saída padrão e, em seguida, termina de volta no prompt do shell. Outro teste compara duas afirmações e, se alguma for verdadeira, gera uma string. Por exemplo, para verificar se existe um arquivo denominado “arquivo1.txt” ou um arquivo denominado “arquivo1.doc”, você pode usar o seguinte comando: test -e arquivo1.txt -o -e arquivo1.doc && echo “arquivo1 existe “|| echo “arquivo1 não existe”

A parte chave aqui é o -o que significa ou. Existe uma maneira melhor e mais comumente usada de realizar o mesmo teste: test -e file1.txt || teste -e arquivo1.doc && echo “arquivo1 existe” || echo “arquivo1 não existe”

Eliminando a palavra-chave de teste

Você realmente não precisa usar a palavra teste para realizar a comparação. Tudo que você precisa fazer é colocar a declaração entre colchetes da seguinte forma:

[ -e file1.txt ] && echo “arquivo1 existe” || echo “arquivo1 não existe”

O [ and ] basicamente significa o mesmo que teste. Agora que você sabe disso, pode melhorar a comparação de várias condições da seguinte maneira:

[ 4 -eq 4 ] && [ “moo” = “moo” ] && echo “é uma vaca” || eco “não é uma vaca”

[ -e file1.txt ] || [ -e file1.doc ] && echo “arquivo1 existe” || echo “arquivo1 não existe”

Resumo

O comando de teste é mais útil em scripts porque você pode testar o valor de uma variável em relação a outra e controlar o fluxo do programa. Na linha de comando, use-o para testar se um arquivo existe ou não.