Не делай этого.Явная ссылка на $?
почти никогда не нужна.Если вы хотите выйти со статусом 1 в случае сбоя команды, вы можете просто сделать:
cmd || exit 1
Если вы хотите выйти с тем же ненулевым значением, возвращенным командой, вы можете просто сделать:
cmd || exit
Существует множество примеров плохого кода, который вместо этого выполняет такие вещи, как:
cmd
if [ "$?" -ne 0 ]; then echo cmd failed >&2; exit 1; fi
, и по многим причинам это плохая практика.Нет смысла заставлять оболочку печатать общее сообщение об ошибке;Сама команда должна была уже написать подробное сообщение об ошибке, и смутное «cmd fail» - просто шум линии.Кроме того, вы часто будете видеть set -e
, который в основном шлепает || exit
в конце каждой простой команды, но имеет много непреднамеренных побочных эффектов и крайних случаев, и его реализация менялась на протяжении истории и разных версий одной и той же оболочкибудет по-разному обрабатывать граничные случаи, поэтому использовать его на самом деле не очень хорошая идея.
Что касается вопроса "чем заканчивается это утверждение?";заканчивается fi
.Общая форма if
- это if CMD; then ...; else ...; fi
, где CMD - это некоторый набор конвейеров (например, вы можете сделать if echo foo | grep bar; cmd2 | foo; then ....
).Если CMD возвращает статус 0, выполняется первый набор команд (между «then» и «else»).Если CMD возвращает ненулевое значение, команды между «else» и «fi» выполняются.Предложение else не является обязательным.Не обманывайтесь [
;это просто команда.На мой взгляд, было бы более понятно, если бы вы использовали его альтернативное написание test
, которое не требует окончательного аргумента ]
.IOW, вы могли бы написать if test "$?" -ne 0; then ...; fi
.