Командой в BASH считается отдельная команда (например, ls) или конвейер (pipeline) – последовательность двух или более команд, в которой стандартный вывод предшествующей команды передаются на стандартный ввод последующей (ls | more). Но синтаксис конвейера несколько расширен по сравнению с sh, и имеет следующий вид:
[time [-p] ] [ ! ] command [ | command2 ... ],
где в факультативную часть входит "time" – зарезервированное слово, используемое для измерения времени, затраченного на выполнение команды, а также "!" – знак отрицания, меняющий код завершения команды на противоположный.
Обычно конвейер находится на одной строке. Если требуется разместить его на нескольких строках, их можно объединять в одну логическую строку, используя знак переноса "\". На одной строке можно записывать несколько команд, разделяя их специальными знаками.
Для группирования команд в строке применяются символы ";" и "&". Символ ";" используется для последовательного выполнения нескольких команд: после завершения одной команды начинается выполнение другой. Если вместо ";" используется "&", то команда, сопровождаемая этим знаком, выполняется в фоновом режиме, а выполнение следующей команды начинается немедленно, и, таким образом, две или более команд выполняются параллельно. Например:
команда1; команда2 – последовательное выполнение;
команда1 & команда2 – параллельное выполнение.
Последовательное выполнение команд можно связать условиями: "&&" (удачного выполнения предшествующей) и "||" (неудачного выполнения предшествующей). Например,
· выполнить команду1, и если она выполнилась удачно, выполнить команду2:
команда1 && команда2;
· выполнить команду1, и если она выполнилась неудачно, выполнить команду2:
команда1 || команда2.
Как известно, каждая команда возвращает ОС некоторый код завершения, по которому можно судить об «успешности» выполнения. Командную строку можно считать логическим выражением, значение которого требуется вычислить, где отдельные команды есть переменные, принимающие значение "истина" или "ложь", то знаки "&&" и "||" можно рассматривать как операции логического И и ИЛИ. Отсюда понятна и логика действия этих связок в командой строке: если первая из двух команд, соединенных связкой И, возвращает "ложь", то результат всего выражения - заведомо "ложь", поэтому вторая команда не выполняется; аналогично, если первая из двух команд, соединенных связкой ИЛИ, выполнилась успешно, то уже известно, что результат всего выражения - "истина", и вторая команда не выполняется.
В отличие от подобных операций в языке Си, связки "||" и "&&" в BASH имеют одинаковый приоритет, то есть выражение "A || B && C" аналогично "(A || B) && C", но не "A || (B && C)".
Для изменения приоритета (и порядка выполнения команд) можно использовать круглые ( ) или фигурные { } скобки. Так, скобки { } обеспечивают группирование команд в один конвейер.
Чтобы сделать перенаправление ввода-вывода для нескольких команд, вместо конструкции
cmd1 >a; cmd2 >>a"
можно писать
{cmd1; cmd2;}>a.
В скобки ( ) заключают команды, после выполнения которых сделанные ими изменения среды (environment vars) восстанавливаются. Например, строка:
a="global"; (a="local"; echo now a is $a); echo and now $a
выведет:
now a is local
and now global
Фигурные, и круглые скобки можно использовать для группирования команд с целью изменения порядка выполнения команд со связками "||" и "&&".
Проверка значения арифметического выражения с помощью (( )). Выражение, заключенное в (( )), будет вычислено по правилам вычисления арифметических выражений, действующих, кроме данного случая, еще и для конструкции $(()) и команды let. После вычисления выражения команда считается выполненной успешно (и возвращается код 0) в том случае, если результат отличен от нуля, и неуспешно в случае равенства результата нулю.
Символ "!".Ставится перед командой для отрицания кода ее выхода.