Eu queria saber qual seria a melhor maneira de verificar o status de saída em uma instrução if para ecoar uma saída específica.
Estou pensando nisso
if [ $? -eq 1 ]
then
echo "blah blah blah"
fi
O problema que eu também estou tendo é que a instrução exit está antes da instrução if simplesmente porque precisa ter esse código de saída. Além disso, sei que estou fazendo algo errado, pois a saída obviamente sairia do programa.
bash
shell
if-statement
error-handling
deadcell4
fonte
fonte
some_program; rc=$?; if [ ${rc} -eq 1 ] .... fi ; exit ${rc}
Respostas:
Todo comando executado tem um status de saída.
Essa verificação está analisando o status de saída do comando que foi concluído mais recentemente antes da execução dessa linha.
Se você deseja que o seu script saia quando o teste retornar verdadeiro (o comando anterior falhou), coloque
exit 1
(ou o que seja) dentro desseif
bloco após oecho
.Dito isto, se você estiver executando o comando e desejar testar sua saída usando o seguinte, geralmente é mais direto.
Ou, para mudar isso, use
!
a negaçãoObserve, porém, que nenhum deles se importa com o código de erro. Se você sabe que se importa apenas com um código de erro específico, precisa verificar
$?
manualmente.fonte
a_command || return 1
return
funciona apenas em uma função e um script de origem. Você precisaexit
do outro caso (que faz muito em uma função e em um script de origem). Mas sim, esse é certamente um padrão razoável se você não precisar de nenhuma limpeza específica ou saída extra.dash
, o shell não interativo padrão em muitas distribuições modernas de linux, não se importa com a distinção entrereturn
eexit
dentro dos scripts de shell executados.dash
sai do script mesmo se eu o usarreturn
.if <command>
passa se o código de saída é 0. Em qualquer outra língua seria o contrárioif ! some_command | some_other_command
irá ignorar o status de some_command. As duas soluções alternativas de comando são:set -o pipefail
(pode alterar a funcionalidade em outras partes do seu programa) ou mover aif
instrução paraif [[ ${PIPESTATUS[0]} -ne 0 ]]
como um comando de acompanhamento separado (feio, mas funcional). Se você estiver usandoset -e
, também desejará adicionar|| true
ao final do tubo ao usar a segunda solução, pois remover o tubo do fluxo de controle oferecido porif
faria com que ele saísse imediatamente.Observe que os códigos de saída! = 0 são usados para relatar erros. Então, é melhor fazer:
ao invés de
fonte
dnf check-update
retorna 0 (sem atualizações), 100 (atualizações disponíveis) ou 1 (erro).dnf
desenvolvedores escolherem dessa maneira, a escolha é deles. Mas ainda assim, sua escolha não faz a especificação para ser quebrado :)$?
é um parâmetro como outro qualquer. Você pode salvar seu valor para usar antes de finalmente ligarexit
.fonte
Alternativa à
if
declaração explícitaMinimamente:
test $? -eq 0 || echo "something bad happened"
Completo:
fonte
Apenas para adicionar à resposta útil e detalhada :
Se você precisar verificar o código de saída explicitamente, é melhor usar o operador aritmético
(( ... ))
, desta maneira:Ou use uma
case
instrução:Resposta relacionada sobre tratamento de erros no Bash:
fonte