Как проверить статус завершения с помощью оператора 'if'
Я столкнулся с проблемой проверки статуса выхода в условии if
для вывода определённого сообщения. В данный момент я вот как это представляю:
if [ $? -eq 1 ]; then
echo "blah blah blah"
fi
Однако у меня есть ещё одна проблема: инструкция exit
стоит перед if
, так как необходимо получить этот код выхода. Я понимаю, что что-то делаю не так, ведь команда exit
завершает программу и не позволяет выполнить проверку.
Как правильно реализовать эту проверку статуса выхода и вывести нужный результат? Может быть, есть лучший способ? Спасибо!
5 ответ(ов)
Каждая команда, которая выполняется, имеет статус завершения.
Проверка, о которой идет речь, смотрит на статус завершения команды, которая была выполнена непосредственно перед этой строкой.
Если вы хотите, чтобы ваш скрипт завершался, когда этот тест возвращает истину (то есть предыдущая команда завершилась с ошибкой), вам нужно вставить exit 1
(или любое другое значение) внутрь блока if
после echo
.
Тем не менее, если вы запускаете команду и хотите проверить её вывод, использование следующего подхода часто бывает более понятным:
if some_command; then
echo "команда вернула истину"
else
echo "команда вернула ошибку"
fi
Или, чтобы инвертировать это, используйте !
для отрицания:
if ! some_command; then
echo "команда вернула ошибку"
else
echo "команда вернула истину"
fi
Однако стоит отметить, что ни один из этих подходов не учитывает, какой именно код ошибки был. Если вам важен конкретный код ошибки, то необходимо проверить $?
вручную.
Обратите внимание, что коды выхода, отличные от 0, используются для отчета об ошибках. Поэтому лучше делать так:
retVal=$?
if [ $retVal -ne 0 ]; then
echo "Ошибка"
fi
exit $retVal
вместо этого:
# не сработает для кодов ошибок == 1
retVal=$?
if [ $retVal -eq 1 ]; then
echo "Ошибка"
fi
exit $retVal
Поскольку любой код выхода, отличающийся от 0, обозначает ошибку, рекомендуется использовать условие -ne 0
, чтобы обрабатывать все возможные ошибки, а не только ошибку с кодом 1.
Вместо явного использования оператора if
можно воспользоваться логическими операциями &&
и ||
. Вот минимальный пример:
test $? -eq 0 || echo "что-то пошло не так"
А вот более полный вариант:
EXITCODE=$?
test $EXITCODE -eq 0 && echo "всё прошло успешно" || echo "что-то пошло не так"
exit $EXITCODE
Таким образом, вы можете обрабатывать результат выполнения команды без явной конструкции if
, используя логические операторы для условного выполнения команд на основе кода возврата.
$?
— это параметр, как и любой другой. Вы можете сохранить его значение и использовать его перед окончательным вызовом exit
.
Пример использования:
exit_status=$?
if [ $exit_status -eq 1 ]; then
echo "что-то пошло не так"
fi
exit $exit_status
В данном коде мы сохраняем код возврата последней выполненной команды в переменную exit_status
. Затем, если этот код равен 1, выводим сообщение "что-то пошло не так". В конце скрипта мы вызываем exit
, передавая ему сохранённый код возврата. Это позволяет правильно сообщить о завершении скрипта в зависимости от результата выполнения предыдущих команд.
Если вы пишете функцию, что всегда предпочтительнее, вы можете пропагировать ошибку следующим образом:
function()
{
if <command>; then
echo "сработало"
else
return 1
fi
}
Теперь вызывающий код может делать что-то вроде function && следующее
, как и ожидалось! Это полезно, если вам нужно выполнить много операций в блоке if
и т.д. (в противном случае существуют однострочные варианты для этого). Убедиться в работе этой функции можно легко, используя команду false
.
Есть ли команда TRY CATCH в Bash?
Как выводить команды оболочки по мере их выполнения
Как сделать паузу в shell-скрипте на одну секунду перед продолжением?
Как получить пароль из оболочки без вывода в терминал?
Проверьте, нужно ли выполнять pull в Git