Мне было интересно, что будет лучшим способом проверить состояние выхода в операторе if, чтобы повторить конкретный вывод.
Я думаю об этом
if [ $? -eq 1 ]
then
echo "blah blah blah"
fi
У меня также есть проблема в том, что оператор выхода находится перед оператором if просто потому, что он должен иметь этот код выхода. Кроме того, я знаю, что делаю что-то не так, поскольку выход, очевидно, приведет к выходу из программы.
bash
shell
if-statement
error-handling
deadcell4
источник
источник
some_program; rc=$?; if [ ${rc} -eq 1 ] .... fi ; exit ${rc}
Ответы:
Каждая команда, которая выполняется, имеет статус выхода.
Эта проверка проверяет состояние завершения команды, завершившейся совсем недавно до запуска этой строки.
Если вы хотите ваш сценарий , чтобы выйти , когда этот тест возвращает истину (предыдущая команда не удалось) , то вы положили
exit 1
(или любой другой ) внутри этогоif
блока послеecho
.Это сказанное, если вы запускаете команду и хотите проверить ее вывод, используя следующее, часто бывает проще.
Или перевернуть это использовать
!
для отрицанияОбратите внимание , однако , что ни один из этих забот , что код ошибки. Если вы знаете, что заботитесь только о конкретном коде ошибки, вам нужно проверить это
$?
вручную.источник
a_command || return 1
return
работает только в функции и скрипте с источником. Вы нуждаетесьexit
для другого случая (который делает слишком много в функции и исходном скрипте). Но да, это, безусловно, разумная модель, если вам не нужна какая-то особая очистка или дополнительный вывод.dash
неинтерактивная оболочка по умолчанию во многих современных дистрибутивах Linux не заботится о различии междуreturn
иexit
внутри исполняемых скриптов оболочки.dash
выходит из сценария, даже если я используюreturn
в нем.if <command>
если код выхода равен 0. На любом другом языке было бы наоборотif ! some_command | some_other_command
будет игнорировать статус some_command. Два наиболее обходных обхода команды -set -o pipefail
(могут изменить функциональность в других частях вашей программы) или переместитьif
операторif [[ ${PIPESTATUS[0]} -ne 0 ]]
в качестве отдельной последующей команды (некрасиво, но функционально). Если вы используетеset -e
то, вы также захотите добавить|| true
в конец канала при использовании второго решения, поскольку удаление канала из предлагаемого потока управленияif
в противном случае приведет к его немедленному выходу.Обратите внимание, что коды выхода! = 0 используются для сообщения об ошибке. Итак, лучше сделать:
вместо того
источник
dnf check-update
возвращает 0 (без обновлений), 100 (доступные обновления) или 1 (ошибка).dnf
разработчики выбрали этот путь, это их выбор. Но, тем не менее, их выбор не делает нарушение спецификации :)$?
это параметр, как и любой другой. Вы можете сохранить его значение, чтобы использовать его перед вызовомexit
.источник
Альтернатива явному
if
утверждениюМинимально:
test $? -eq 0 || echo "something bad happened"
Complete:
источник
Просто чтобы добавить к полезному и подробному ответу :
Если вам нужно явно проверить код выхода, лучше использовать арифметический оператор
(( ... ))
, вот так:Или используйте
case
утверждение:Связанный ответ об обработке ошибок в Bash:
источник