Я читал о && и ||, и я хотел бы выполнить две команды в ложном случае.
Я попробовал ;
но это работает всегда. Я попытался поместить его в фигурные скобки { command1; command2 }
но это приводит к синтаксической ошибке.
Я хочу сделать что-то как
command && echo "Ok, continuing" || echo "Check internet connection"; exit 1
из которого только выходят, если нет никакого Интернет-соединения.
Используя parens помещает команды в подоболочку, которая является не всегда, что Вы хотите. С другой стороны, используйте фигурные скобки:
command && echo "Ok, continuing" || { echo "Check internet connection"; exit 1; }
Прием здесь - то, что, в отличие от parens, заключительная команда в фигурных скобках должна сопровождаться ;
.
Изогнутая фигурная скобка является допустимым аргументом команде. Например, вот изогнутая фигурная скобка как аргумент echo
:
$ echo }
}
Следовательно, если оболочка видит:
{ command1; command2 }
Оболочка интерпретирует command1 как имеющий аргументы и command2 как наличие одного аргумента, состоящего из символа }
. Изогнутая фигурная скобка }
только интерпретируется как закрытие группировки, если оно следует за точкой с запятой или новой строкой. Сделать вышеупомянутую работу:
{ command1; command2; }
{...}
и (...)
Заметьте что следующие наборы x
к 10, но что о той установке забывают перед echo
выполнения команды:
$ x=0; false || ( echo Hello; x=10 )
Hello
$ echo $x
0
С фигурными скобками, в отличие от этого, установкой x=10
помнится:
$ x=0; false || { echo Hello; x=10; }
Hello
$ echo $x
10
Различие - то, потому что переменные присвоения в подоболочке не выживают после того, как подоболочка завершается.
От man bash
:
(список)
список выполняется в подсреде оболочки (см. СРЕДУ ВЫПОЛНЕНИЯ КОМАНДЫ ниже). Переменные присвоения и встроенные команды, которые влияют на среду оболочки, не остаются в силе после того, как команда завершается. Статус возврата является статусом выхода списка.
{список;}
список просто выполняется в текущей среде оболочки. список должен быть завершен с новой строкой или точкой с запятой. Это известно как команда группы. Статус возврата является статусом выхода списка. Обратите внимание, что в отличие от метасимволов (и), {и} зарезервированные слова и должны произойти, где зарезервированному слову разрешают быть распознанным. Так как они не вызывают разрыв слова, они должны быть разделены от списка пробелом или другим метасимволом оболочки.
[Акцент, добавленный]