it-roy-ru.com

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

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

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

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

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

165
deadcell4

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

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

Если вы хотите, чтобы ваш сценарий завершался, когда этот тест возвращает значение 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

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

173
Etan Reisner

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

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

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

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

Минимально:

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

Полное:

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