O comando test no unix não imprime uma saída


20

Quando digito isso no terminal

test 4 -lt 6

Eu não recebo nenhuma saída. Por que não? Eu preciso que 0 ou 1


11
Não seria bom se 'test' tivesse uma opção para gerar um valor imediatamente? Apenas a opção. É tudo o que precisamos.
Todd Walton

Respostas:


15

Você recebe 0 ou 1. No código de saída.

bash-4.2$ test 4 -lt 6

bash-4.2$ echo $?
0

bash-4.2$ test 4 -gt 6

bash-4.2$ echo $?
1

Atualização : para armazenar o código de saída para uso posterior, basta atribuí-lo a uma variável:

bash-4.2$ test 4 -lt 6

bash-4.2$ first=$?

bash-4.2$ test 4 -gt 6

bash-4.2$ second=$?

bash-4.2$ echo "first test gave $first and the second $second"
first test gave 0 and the second 1

11
existe uma maneira de canalizar o código de saída?
Indieman 11/11/12

3
Não. Somente a saída pode ser redirecionada. Enfim, geralmente não há necessidade disso. Para armazená-lo para uso posterior, apenas atribua-o a uma variável. Ou diga-nos qual é exatamente a sua intenção com esse valor.
manatwork

2
O código de saída é colocado na $?variável - pelo menos até que seja substituído pelo próximo comando que você executa.
Shadur 11/11/12

11
PS: você pode usar a $PIPESTATUSmatriz para obter o resultado de vários comandos em um pipeline. $?será o resultado do último comando no pipeline se a pipefailopção estiver desativada (o padrão).
L0b0 11/11/12

@indieman, se o que você precisa é fazer alguma coisa com base no status de saída, você não precisa mesmo de salvá-lo, exatamente usoif test 4 -lt 6; then echo test succeeeded; else echo test failed; fi
Wildcard

5

Outra maneira é

test 4 -lt 6 && echo 1 || echo 0

Mas tenha cuidado nesse caso. Se testretornar, sucesso e echo 1falha echo 0serão executados.


2

Se você deseja o resultado de uma comparação na saída padrão em vez de um código de saída, pode usar o expr(1)comando:

$ expr 4 '<=' 6
1

Duas coisas a serem observadas:

  1. você provavelmente precisará citar o operador, pois muitos deles conflitam com os metacaracteres do shell
  2. o valor de saída é o oposto do código de retorno para test. testretorna 0 para true (que é o padrão para códigos de saída), mas exprimprime 1 para true.

11
3. Existe um testshell embutido, que é consideravelmente mais rápido (cerca de 50 vezes na minha máquina) do que os executáveis teste exprdo pacote coreutils .
manatwork

+1 para o segundo ponto. Poderia obter um bug que é muito frustrante de encontrar se você estragar tudo.
Emanuel Berg

2

Você pode digitar o seguinte comando:

echo $(test -e myFile.txt) $?
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.