Как остановить сценарий удара, когда условие перестало работать?

Здесь это показывает использованию || и && в одной строке для конкатенации выполнения команд: Как я могу проверить на Кв. - получают ошибки в сценарии удара?

Я пытаюсь остановить выполнение сценария, если определенное условие перестало работать,

например.

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, если Вы хотите, чтобы пользовательские сообщения об ошибках были брошены с альтернативами для использования жемчуга и прерывания, которое я думаю, более устойчивый путь, и посмотрите, что я использую его из моего второго сценария удара вперед!

11
задан 15 June 2017 в 13:57

4 ответа

Вы, вероятно, хотите (как указал Steeldriver)

true || { echo "This shouldn't print" && exit; }

В противном случае ваш сценарий читает по одному условию за раз

a или b и затем выходит

Я думаю, что вы хотите а или (б и выход)?

10
ответ дан 23 November 2019 в 03:51

Проблема в том, что || и & amp; & amp; пропускайте только один последующий раздел цепочки команд, когда условие не выполняется. Если вы напишите полную блочную структуру, это имеет смысл. То, что вы написали, выглядит так:

if ! true ; then
   echo "This shouldn't print"
else
   exit
fi

То, что вы хотите, это:

if ! true ; then
   echo "This shouldn't print"
   exit
fi

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

14
ответ дан 23 November 2019 в 03:51

Самый простой способ потерпеть неудачу при ошибке - использовать опцию 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, которые обычно выполняются успешно. Было бы неплохо сохранить статус завершения неудачной команды, как я это сделал здесь.

7
ответ дан 23 November 2019 в 03:51

Вы можете попробовать немного поэкспериментировать с запуском скрипта с помощью

#!/bin/bash -e

. -E гарантирует, что скрипт выйдет в тот момент, когда что-то вернет false. Определенного сбоя можно избежать с помощью something || true

5
ответ дан 23 November 2019 в 03:51

Другие вопросы по тегам:

Похожие вопросы: