Здесь это показывает использованию ||
и &&
в одной строке для конкатенации выполнения команд: Как я могу проверить на Кв. - получают ошибки в сценарии удара?
Я пытаюсь остановить выполнение сценария, если определенное условие перестало работать,
например.
false || echo "Obvious error because its false on left" && exit
Здесь это печатает Obvious error because its false on the left
и выходит из консоли, которая является тем, что я хотел.
true || echo "This shouldn't print" && exit
Здесь, нет никакой печати эха, но exit
управляйте выполнениями также, т.е. консоль закрывается, не был должен exit
команда не работает, потому что команда эха справа не выполнялась? Или по умолчанию оператор, который рассматривают ложью на левой стороне &&
оператор?
Править: Я должен был упомянуть это прежде, моя цель состояла в том, чтобы повторить ошибку и выход, если бы это не было ясно. w.r.t к моему конкретному случаю фиксации ошибок при группировке условий с помощью && и ||, @bodhi.zazen ответ решает проблему.
Ответ @takatakatek делает это более ясным об управлении потоком, и ссылки руководства удара превосходны
Ответ @muru имеет хорошее объяснение того, почему не использовать набор-e, если Вы хотите, чтобы пользовательские сообщения об ошибках были брошены с альтернативами для использования жемчуга и прерывания, которое я думаю, более устойчивый путь, и посмотрите, что я использую его из моего второго сценария удара вперед!
Вы, вероятно, хотите (как указал Steeldriver)
true || { echo "This shouldn't print" && exit; }
В противном случае ваш сценарий читает по одному условию за раз
a или b и затем выходит
Я думаю, что вы хотите а или (б и выход)?
Проблема в том, что || и & amp; & amp; пропускайте только один последующий раздел цепочки команд, когда условие не выполняется. Если вы напишите полную блочную структуру, это имеет смысл. То, что вы написали, выглядит так:
if ! true ; then
echo "This shouldn't print"
else
exit
fi
То, что вы хотите, это:
if ! true ; then
echo "This shouldn't print"
exit
fi
Когда вы используете условные операторы Bash, лучше избегать их смешивания. Когда вы пишете эту логику, ее гораздо легче понять, и ваши читатели оценят ваш хороший стиль.
Самый простой способ потерпеть неудачу при ошибке - использовать опцию bash -e
(set -e
или /bin/bash -e
в shebang). Однако это не облегчает отправку пользовательских сообщений об ошибках. Есть пара идиом, которые могут упростить его:
die
по Perl Perl имеет очень удобную команду die
, которая печатает сообщение на stderr и вызывает исключение, которое обычно приводит к завершению скрипта. Вы можете эмулировать это:
die () {
ret=$?
print "%s\n" "$@" >&2
exit "$ret"
}
false || die "Obvious error because its false on left"
true || die "This shouldn't print"
trap
ERR
Команда trap <command>
может использоваться для запуска команды при получении сигнала или при выходе из сценария ( trap ... EXIT
), или когда команда возвращает ошибку (trap ... ERR
). Так что-то вроде:
trap 'ret=$?; printf "%s\n" "$ERR_MSG" >&2; exit "$ret"' ERR
Тогда:
ERR_MSG="Obvious error because its false here"
false
ERR_MSG="This shouldn't print"
true
В любом случае я бы предложил использовать хотя бы exit 1
, чтобы указать, что скрипт не удалось . Обычный exit
будет использовать состояние выхода предыдущей команды, что в этих случаях будет командами echo
или printf
, которые обычно выполняются успешно. Было бы неплохо сохранить статус завершения неудачной команды, как я это сделал здесь.
Вы можете попробовать немного поэкспериментировать с запуском скрипта с помощью
#!/bin/bash -e
. -E гарантирует, что скрипт выйдет в тот момент, когда что-то вернет false. Определенного сбоя можно избежать с помощью something || true