Здесь показано использование || и && в одной строке для конкатенации выполнения команд: Как проверить ошибки 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 не запускаться, потому что команда эхо справа не была выполнена? Или по умолчанию заявление считается ложным в левой части оператора &&?
Редактирование: я должен был упомянуть об этом раньше, моя цель состояла в том, чтобы повторить ошибку и выйти, если бы не было ясно , w.r.t к моему конкретному случаю ошибок уловов при условиях группировки с использованием & amp; & amp; и ||, @ bodhi.zazen ответ решает проблему.
@takatakatek ответ дает более четкое представление об управлении потоком, а ссылки руководства bash превосходны
@muru answer has good объяснение того, почему бы не использовать set -e, если вы хотите, чтобы пользовательские сообщения об ошибках были выбраны с альтернативами использования perl и trap, которые, по моему мнению, являются более надежным способом и я вижу, что я использую его из моего второго скрипта bash!
Вы, вероятно, захотите (как указал steeldriver)
true || { echo "This shouldn't print" && exit; }
В противном случае ваш скрипт читает одно условие в момент времени
a или b, а затем выйдет
Я думаю, что вы хотите или (b и выйти)?
Вы, вероятно, захотите (как указал steeldriver)
true || { echo "This shouldn't print" && exit; }
В противном случае ваш скрипт читает одно условие в момент времени
a или b, а затем выйдет
Я думаю, что вы хотите или (b и выйти)?
Вы, вероятно, захотите (как указал steeldriver)
true || { echo "This shouldn't print" && exit; }
В противном случае ваш скрипт читает одно условие в момент времени
a или b, а затем выйдет
Я думаю, что вы хотите или (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, лучше не смешивать их. Логику намного легче понять, пока вы ее пишете, и ваши читатели оценят ваш хороший стиль.
http://mywiki.wooledge.org/BashGuide/TestsAndConditionals#Control_Operators http: // mywiki .wooledge.org / BashPitfalls # cmd1_.26.26_cmd2_.7C.7C_cmd3Самый простой способ сбой при ошибке - использовать опцию -e bash set -e или /bin/bash -e в shebang). Однако это не упрощает отправку пользовательских сообщений об ошибках. Есть несколько идиом, которые могли бы сделать это проще:
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 <command> может использоваться для запуска команды при получении сигнала или при выходе из script (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
можно избежать определенного сбоя,Вы можете попробовать немного поэкспериментировать с запуском скрипта с помощью
#!/bin/bash -e
. -e гарантирует, что сценарий завершится, когда что-то вернет false. Тогда с something || true
можно избежать определенного сбоя,Самый простой способ сбой при ошибке - использовать опцию -e bash set -e или /bin/bash -e в shebang). Однако это не упрощает отправку пользовательских сообщений об ошибках. Есть несколько идиом, которые могли бы сделать это проще:
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 <command> может использоваться для запуска команды при получении сигнала или при выходе из script (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, которые обычно выполняются. Сохранение статуса выхода команды сбоя, как я сделал здесь, было бы неплохо.
Проблема состоит в том, что || и & amp; & amp; только пропустить одну последующую строфу цепочки команд, когда условие не выполняется. Если вы выписываете полную структуру блока, это имеет смысл. То, что вы написали, становится следующим:
if ! true ; then
echo "This shouldn't print"
else
exit
fi
Что вы хотите:
if ! true ; then
echo "This shouldn't print"
exit
fi
Когда вы используете условные операторы быстрого вызова Bash, лучше не смешивать их. Логику намного легче понять, пока вы ее пишете, и ваши читатели оценят ваш хороший стиль.
http://mywiki.wooledge.org/BashGuide/TestsAndConditionals#Control_Operators http: // mywiki .wooledge.org / BashPitfalls # cmd1_.26.26_cmd2_.7C.7C_cmd3Вы можете попробовать немного поэкспериментировать с запуском скрипта с помощью
#!/bin/bash -e
. -e гарантирует, что сценарий завершится, когда что-то вернет false. Тогда с something || true
можно избежать определенного сбоя,Самый простой способ сбой при ошибке - использовать опцию -e bash set -e или /bin/bash -e в shebang). Однако это не упрощает отправку пользовательских сообщений об ошибках. Есть несколько идиом, которые могли бы сделать это проще:
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 <command> может использоваться для запуска команды при получении сигнала или при выходе из script (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, которые обычно выполняются. Сохранение статуса выхода команды сбоя, как я сделал здесь, было бы неплохо.
Проблема состоит в том, что || и & amp; & amp; только пропустить одну последующую строфу цепочки команд, когда условие не выполняется. Если вы выписываете полную структуру блока, это имеет смысл. То, что вы написали, становится следующим:
if ! true ; then
echo "This shouldn't print"
else
exit
fi
Что вы хотите:
if ! true ; then
echo "This shouldn't print"
exit
fi
Когда вы используете условные операторы быстрого вызова Bash, лучше не смешивать их. Логику намного легче понять, пока вы ее пишете, и ваши читатели оценят ваш хороший стиль.
http://mywiki.wooledge.org/BashGuide/TestsAndConditionals#Control_Operators http: // mywiki .wooledge.org / BashPitfalls # cmd1_.26.26_cmd2_.7C.7C_cmd3