Здесь показано использование ||
и &&
в одной строке для объединения выполнения команд: Как я могу проверить наличие ошибок apt-get в скрипте bash?
Я пытаюсь остановить выполнение скрипта, если определенное условие не выполняется,
например
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
команда не выполняться, потому что правая команда эха не была выполнена? Или по умолчанию оператор считается ложным в левой части &&
оператора?
Редактировать: я должен был упомянуть об этом раньше, моя цель состояла в том, чтобы повторить ошибку и выйти, если она не была ясна. Что касается моего конкретного случая обнаружения ошибок при группировании условий с использованием && и ||, то @ bodhi.zazen ответ решает проблему.
Ответ @takatakatek проясняет управление потоком, а ссылки на руководство bash превосходны
Ответ @muru имеет хорошее объяснение, почему бы не использовать set -e, если вы хотите, чтобы пользовательские сообщения об ошибках генерировались с альтернативами использования perl и trap, что, я думаю, является более надежным способом, и я вижу, что использую его начиная со своего второго скрипта bash!
источник
Ответы:
Вы, вероятно, хотите (как указано Steeldriver)
В противном случае ваш скрипт читает по одному условию за раз
А или В, а затем выйти
Я думаю, что вы хотите а или (б и выход)?
источник
{ ... ; }
(как предложено @steeldriver), иначеexit
единственный выход из подоболочки, и родительская оболочка продолжит выполнение скрипта.Проблема в том, что || и && пропускает только один последующий раздел цепочки команд, когда условие не выполняется. Если вы напишите полную блочную структуру, это имеет смысл. То, что вы написали, становится так:
То, что вы хотите, это:
Когда вы используете условные операторы Bash, лучше избегать их смешивания. Когда вы пишете эту логику, ее легче понять, и ваши читатели оценят ваш хороший стиль.
источник
if ... then ... elif ... else ... fi
блоки. Я подозреваю, что вы можете не знать, что в Bash нет истинных логических типов, встречающихся в более сложных языках. Если статус выхода команды равен 0 (ноль), Bash воспринимает это как true / success . Если состояние выхода не равно нулю, Bash воспринимает это как ложное / неудачное .Самый простой способ потерпеть неудачу при ошибке - использовать
-e
опцию bash (set -e
или/bin/bash -e
в shebang). Однако это не облегчает отправку пользовательских сообщений об ошибках. Есть пара идиом, которые могут сделать это проще:die
à la PerlВ Perl есть очень удобная
die
команда, которая печатает сообщение в stderr и вызывает исключение, которое обычно приводит к завершению скрипта. Вы можете подражать этому:trap
ERR
trap <command>
Команда может быть использована для выполнения команды при получении сигнала, или при выходе из сценария (trap ... EXIT
), или когда команда возвращает ошибку (trap ... ERR
). Так что-то вроде:Потом:
В любом случае, я бы предложил использовать хотя бы
exit 1
, чтобы указать, что сценарий не выполнен . Обычный пользовательexit
будет использовать состояние выхода предыдущей команды, которое в этих случаях будет командамиecho
or илиprintf
, которые обычно выполняются успешно. Было бы неплохо сохранить статус завершения неудачной команды, как я это сделал здесь.источник
Вы можете попробовать немного поэкспериментировать с запуском скрипта
-E гарантирует, что скрипт выйдет в тот момент, когда что-то вернет false. Определенного сбоя можно избежать с помощью
something || true
источник