Подтвердить что ты не робот

Как проверить состояние выхода с помощью оператора if

Мне было интересно, что будет лучшим способом проверить состояние выхода в операторе if, чтобы повторить конкретный вывод.

Я думаю об этом

if [ $? -eq 1 ]
then
   echo "blah blah blah"
fi

У меня также есть проблема в том, что оператор выхода находится перед оператором if просто потому, что он должен иметь этот код выхода. Кроме того, я знаю, что делаю что-то не так, поскольку выход, очевидно, приведет к выходу из программы.

4b9b3361

Ответ 1

Каждая выполняемая команда имеет статус выхода.

Эта проверка проверяет статус выхода команды, которая была завершена совсем недавно, до того, как эта строка будет запущена.

Если вы хотите, чтобы ваш script вышел, когда этот тест вернет true (предыдущая команда не удалась), вы поместите exit 1 (или что-то еще) внутри этого блока if после echo.

Если вы выполняете команду и хотите проверить ее вывод, используя следующее, часто более прямолинейно.

if some_command; then
    echo command returned true
else
    echo command returned some error
fi

Или для того, чтобы использовать это ! для отрицания

if ! some_command; then
    echo command returned some error
else
    echo command returned true
fi

Обратите внимание, что ни тот, ни другой не заботятся о том, что такое код ошибки. Если вы знаете, что вам нужен только конкретный код ошибки, вам необходимо вручную проверить $?.

Ответ 2

Обратите внимание, что коды выхода! = 0 используются для сообщения об ошибке. Итак, лучше сделать:

retVal=$?
if [ $retVal -ne 0 ]; then
    echo "Error"
fi
exit $retVal

вместо

# will fail for error codes > 1
retVal=$?
if [ $retVal -eq 1 ]; then
    echo "Error"
fi
exit $retVal

Ответ 3

$? - это параметр, как любой другой. Вы можете сохранить его значение для использования, прежде чем в итоге вызовите exit.

exit_status=$?
if [ $exit_status -eq 1 ]; then
    echo "blah blah blah"
fi
exit $exit_status

Ответ 4

Альтернатива явному выражению if

Минимально:

test $? -ne 0 || echo "something bad happened"

Полное:

EXITCODE=$?
test $EXITCODE -ne 0 && echo "something good happened" || echo "something bad happened"; 
exit $EXITCODE

Ответ 5

Просто чтобы добавить к полезному и подробному ответу:

Если вам необходимо явно проверить код выхода, лучше использовать арифметический оператор ((... )) следующим образом:

run_some_command
(($? != 0)) && { printf '%s\n' "Command exited with non-zero"; exit 1; }

Или используйте оператор case:

run_some_command; ec=$?  # grab the exit code into a variable so that it can
                         # be reused later, without the fear of being overwritten
case $ec in
    0) ;;
    1) printf '%s\n' "Command exited with non-zero"; exit 1;;
    *) do_something_else;;
esac

Связанный ответ об обработке ошибок в Bash:

Ответ 6

tail /var/log/XXX.log | grep 'to be found' && echo found

Ответ 7

Ответ от Oo.oO правильный.

Если вы хотите пойти еще дальше, я использую это в своем PS1 для просмотра кода завершения каждой команды, только если она содержит ошибку:

function ret_validate { if [ $1 != 0 ] ; then echo -n -e " Err:$1" ; fi }
PS1='${debian_chroot:+($debian_chroot)}[\t]\[\033[01;32m\]\[email protected]\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\[\e[01;31m\]'ret_validate \$?'\[\e[m\] \$ '

Просто добавьте эти строки в ваш .bashrc если хотите его увидеть.