6

Как проверить статус завершения с помощью оператора 'if'

7

Я столкнулся с проблемой проверки статуса выхода в условии if для вывода определённого сообщения. В данный момент я вот как это представляю:

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

Однако у меня есть ещё одна проблема: инструкция exit стоит перед if, так как необходимо получить этот код выхода. Я понимаю, что что-то делаю не так, ведь команда exit завершает программу и не позволяет выполнить проверку.

Как правильно реализовать эту проверку статуса выхода и вывести нужный результат? Может быть, есть лучший способ? Спасибо!

5 ответ(ов)

5

Каждая команда, которая выполняется, имеет статус завершения.

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

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

Тем не менее, если вы запускаете команду и хотите проверить её вывод, использование следующего подхода часто бывает более понятным:

if some_command; then
    echo "команда вернула истину"
else
    echo "команда вернула ошибку"
fi

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

if ! some_command; then
    echo "команда вернула ошибку"
else
    echo "команда вернула истину"
fi

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

4

Обратите внимание, что коды выхода, отличные от 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.

1

Вместо явного использования оператора if можно воспользоваться логическими операциями && и ||. Вот минимальный пример:

test $? -eq 0 || echo "что-то пошло не так"

А вот более полный вариант:

EXITCODE=$?
test $EXITCODE -eq 0 && echo "всё прошло успешно" || echo "что-то пошло не так"
exit $EXITCODE

Таким образом, вы можете обрабатывать результат выполнения команды без явной конструкции if, используя логические операторы для условного выполнения команд на основе кода возврата.

0

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

Пример использования:

exit_status=$?
if [ $exit_status -eq 1 ]; then
    echo "что-то пошло не так"
fi
exit $exit_status

В данном коде мы сохраняем код возврата последней выполненной команды в переменную exit_status. Затем, если этот код равен 1, выводим сообщение "что-то пошло не так". В конце скрипта мы вызываем exit, передавая ему сохранённый код возврата. Это позволяет правильно сообщить о завершении скрипта в зависимости от результата выполнения предыдущих команд.

0

Если вы пишете функцию, что всегда предпочтительнее, вы можете пропагировать ошибку следующим образом:

function()
{
    if <command>; then
        echo "сработало"
    else
        return 1
    fi
}

Теперь вызывающий код может делать что-то вроде function && следующее, как и ожидалось! Это полезно, если вам нужно выполнить много операций в блоке if и т.д. (в противном случае существуют однострочные варианты для этого). Убедиться в работе этой функции можно легко, используя команду false.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь