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
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.
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'<='61
Duas coisas a serem observadas:
você provavelmente precisará citar o operador, pois muitos deles conflitam com os metacaracteres do shell
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.
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.
Respostas:
Você recebe 0 ou 1. No código de saída.
Atualização : para armazenar o código de saída para uso posterior, basta atribuí-lo a uma variável:
fonte
$?
variável - pelo menos até que seja substituído pelo próximo comando que você executa.$PIPESTATUS
matriz para obter o resultado de vários comandos em um pipeline.$?
será o resultado do último comando no pipeline se apipefail
opção estiver desativada (o padrão).if test 4 -lt 6; then echo test succeeeded; else echo test failed; fi
Outra maneira é
Mas tenha cuidado nesse caso. Se
test
retornar, sucesso eecho 1
falhaecho 0
serão executados.fonte
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:Duas coisas a serem observadas:
test
.test
retorna 0 para true (que é o padrão para códigos de saída), masexpr
imprime 1 para true.fonte
test
shell embutido, que é consideravelmente mais rápido (cerca de 50 vezes na minha máquina) do que os executáveistest
eexpr
do pacote coreutils .Você pode digitar o seguinte comando:
fonte