Блок условного исполнения с || и круглые скобки

Так что это должно быть просто. Я пытаюсь проверить условие в верхней части сценария и освободить весь сценарий, когда условие не выполняется, и у меня есть два оператора, которые я хочу выполнить, когда я закладываю. С одиноким exit и никаким вторым утверждением все в порядке, но независимо от того, как я добавляю второе утверждение, я не могу заставить его полностью выйти. Неявное косметическое правило состоит в том, что все это должно быть на одной линии. Я обнаружил это, когда это однострочное изменение скрипта работало не так, как предполагалось. Сценарий продолжал идти.

Сначала позвольте мне показать, что работает. Следующая строка полностью завершается, если переменная $ USER не является «x», и это хорошо. Я знаю, что это работает, потому что ввод этой строки в окно терминала закроет это окно терминала (если только ваш идентификатор пользователя не является «x»), поэтому он действительно выполняет вывод верхнего уровня:

 [ $USER = 'x' ] || exit 1 

Так что это хорошо и так, как я хочу, за исключением того, что я хочу эхо-сообщение перед выходом; однако, если я пытаюсь добавить эхо, выход больше не происходит или, скорее, он происходит «по-другому», например, в контексте функции bash или что-то в этом роде. Следующая строка не закроет ваш терминал, и это плохо.

 [ $USER = 'x' ] || (echo "Time to bail" ; exit 1) 

Я подумал, что, возможно, полу-двоеточие ели от эха, но нет, выход, похоже, попадает. Откуда мне знать? Я изменил код выше, а затем повторил $? и я увидел, какую ценность я ставлю там, где вы видите «1» выше. И, конечно, я просматривал эти значения в окне терминала, которое я хотел закрыть, и он не был закрыт.

Следующий вариант также показывает второй способ выполнения эха и второго оператора, но опять же такое же поведение возникает при использовании выхода:

 [ $USER = 'x' ] || (echo "Time to bail" && exit 1) 

Я надеюсь, что кто-то здесь сделает все это не только не странным, но разумным.

Так что это невозможно сделать на одной линии?

( bash --version : GNU bash, version 4.3.30(1)-release )

2 Solutions collect form web for “Блок условного исполнения с || и круглые скобки”

То, что вы ищете, выглядит примерно так:

 [ "$USER" = "x" ] || { echo "Time to bail"; exit 1; } 

{ list; } { list; } выполняет команды в данном списке в текущем контексте оболочки. В отличие от номенклатуры ( list ) не создается подоболочка. Вызов вызова между скобками выйдет из этой подоболочки, а не самой родительской оболочки.


Примеры в вашем вопросе с помощью оператора if на одной строке или нескольких строках синтаксически правильны. Я не могу воспроизвести это поведение. Неважно, сколько строк там arre; оператор if никогда не запускает подоболочку в своем теле.


BTW: Я добавил двойные кавычки к переменной в условии, потому что, когда переменная $USER пуста, конструкция будет расширяться до [ = "x" ] которая недопустима. С двойными кавычками он расширяется до [ "" = "x" ] .

Благодаря подсказке @ mikeserv, ответ необычайно прост, и это связано с тем, что важно признать, что круглые скобки представляют собой особый вид группировки. Скобки создают суб-оболочку, и именно поэтому я видел отсутствие того, что я назвал выходом «верхнего уровня».

Полное объяснение здесь , и вот ключевой отрывок:

Размещение списка команд между круглыми скобками приводит к созданию среды подклассов … Размещение списка команд между фигурными фигурными скобками приводит к тому, что список будет выполнен в текущем контексте оболочки.

Что здесь немного неприятно, так это то, что эти два не являются полностью взаимозаменяемыми, а фигурные скобки требуют полуколонны перед окончательным курчавым, в то время как в круглых скобках нет. Синтаксис, который я устанавливаю, пытается устранить полуколоны и использовать форму «&&»:

[$ USER == 'x'] || {echo «Время под залог» && exit 1; }

Итак, в целом, круглые скобки лучше смотреть, чем на колючки, а завитки с их полуколоновым требованием делают один вкладыш менее похожим на однострочный.

  • grep. * возвращает результаты из .bash_history и жалуется на
  • Нарушается ли поведение CDPATH в раке bourne (/ bin / sh)
  • Переменные среды установки OS X
  • Увеличение десятичных значений до следующего целого значения
  • Ssh логин / shell не полностью работает (как раньше)
  • Изменение оболочки входа по умолчанию в / bin / bash для ВСЕХ пользователей ldap с сервера LDAP - не клиент
  • Подстановочный шаблон rm не работает
  • Может ли переменная оболочки включать - символ?
  • Когда sh является символической ссылкой на bash или тире, bash ограничивает себя соблюдением POSIX, поэтому он должен быть на 100% совместим с sh?
  • Как перезапустить скрипт Python автоматически, если он убит или умирает
  • Есть ли элегантный способ установить переменную оболочки в содержимое файла?
  • Linux и Unix - лучшая ОС в мире.