Linux фигурные скобки bash
После того, как команда будет разделена на отдельные лексемы (смотрите раздел «Синтаксис командной оболочки»), над этими лексемами или словами могут быть выполнены дополнительные замены или подстановки значений. Есть восемь видов таких дополнительных действий, которые мы рассматриваем в следующих разделах в той последовательности, в какой они применяются к лексемам.
После выполнения всех этих действий, происходит удаление кавычек.
Раскрытие фигурных скобок
Раскрытие фигурных скобок — это механизм, с помощью которого можно генерировать строки произвольного вида. В шаблонах, которые при этом используются, может присутствовать необязательное НАЧАЛО, за которым между фигурными скобками идет последовательность строк, разделенных запятыми. Затем идет необязательное ЗАВЕРШЕНИЕ. Начало является префиксом всех строк, генерация которых задана внутри фигурных скобок, а завершение просто добавляется к концу каждой строки, полученной перебором слева направо строк, указанных внутри скобок.
Допускается вложенность фигурных скобок. Полученные результаты не сортируются; сохраняется порядок, определенный перебором слева направо:
franky ~> echo spl spell spill spall
Фигурные скобки обрабатываются раньше всех других дополнительных подстановок. В полученном результате сохраняются все символы, предназначенные для следующих подстановок. Обработка строго текстовая. Bash не осуществляет интерпретацию каких-либо синтаксических конструкций, расположенных внутри фигурных скобок. Чтобы избежать конфликтов, связанных с подстановкой параметров, строка «$
Правильно сформированный шаблон должен иметь открывающую и закрывающую фигурную скобку, причем они не должны быть в кавычках, и, по крайней мере, одну запятую, которая также не должна быть в кавычках. Любой неправильно сформированный шаблон обрабатываться не будет.
Замена символа «тильда»
Если слово начинается с символа «тильда» («~»), который не должен быть в кавычках, то все символы до первого слеша, который также не должен быть в в кавычках, (или все символы, если слеш без кавычек отсутствует) считаются префиксом тильды. Если в префиксе тильды нет символов, заключенных в кавычки, то символы, следующие за тильдой, трактуются как возможное имя для входа в систему. Если это имя является пустой строкой, то тильда заменяется на значение переменной окружения HOME. Если значение переменной HOME не установлено, то вместо него подставляется название домашнего директория пользователя, исполняющего командную оболочку. Иначе префикс тильды заменяется названием домашнего директория, связанного с указанным именем входа в систему.
Если префиксом тильды будет «~+», то он будет заменен значением переменной PWD. Если префиксом тильды будет «~-«, то он будет заменен значением переменной OLDPWD, если это значение установлено.
Если символы, следующие после тильды в префиксе тильды, состоят из числа N с необязательным префиксом «+» или «-«, тильда-префикс заменяется элементом из стека директориев, точно таким, какой будет отображаться встроенной командой dirs с аргументом, которым будут символы, следующие после тильды в префиксе тильды. Если в префиксе тильды, кроме символа тильды, указывается только число без предваряющего символа «+» или «-«, то подразумевается символ «+».
Если имя входа в систему неверное или если возникли проблемы в обработке тильды, то слово с тильдой не изменяется.
Для каждой операции присваивания переменной значения проверяется, присутствует ли сразу после символов «:» или » $» позволяет указывать параметры, осуществлять подстановку результата работы команд или выполнять замену арифметических выражений результатом их вычисления. Имя параметра или символ, для которого будет выполняться подстановка, может быть заключен в фигурные скобки, которые не являются обязательными, но служат для того, чтобы к переменной не добавлялись символы, идущие сразу после переменной, которые могут быть проинтерпретированы как часть имени.
Когда используются фигурные скобки, закрывающей фигурной скобкой будет считаться первая «>», перед которой не проставлен обратный слеш, а сама скобка не находится внутри кавычек, не является частью арифметического выражения и не появляется в результате выполнения команд или подстановки параметров.
Обычным форматом для подстановки параметра является «$». Вместо такой строки подставляется значение переменной «PARAMETER». Фигурные скобки необходимы, когда «PARAMETER» является позиционным параметром, в котором используется более одной цифры, либо когда за именем «PARAMETER» следует символ, который не должен интерпретироваться как часть этого имени.
Если первым символом имени «PARAMETER» является восклицательный знак, то Bash вначале производит все подстановки и замены в строке, сформированной из оставшейся части «PARAMETER», рассматриваемой как имя переменной; затем происходит подстановка значений и в дальнейшем при подстановках используется это значение, а не значение самого имени «PARAMETER». Этот механизм известен как косвенная подстановка.
Вы наверняка знакомы с непосредственной подстановкой значений параметров, поскольку она выполняется всегда, даже в самых простых случаях, в тех примерах, что были приведены ранее или в следующих:
franky ~> echo $SHELL /bin/bash
Ниже приведен пример косвенной подстановки:
franky ~> echo $ NNTPPORT NNTPSERVER NPX_PLUGIN_PATH
Обратите внимание, что это не то же самое, что и echo $N* .
В следующем примере создается поименованная переменная в случае, если она еще не существует:
franky ~> echo $FRANKY franky ~> echo $ Franky
Однако специальные параметры, которые могут находиться среди других позиционных параметров, передавать таким образом нельзя.
Мы еще будем рассматривать использование фигурных скобок при работе с переменными в главе 10 «Подробнее о переменных». Более подробную информацию можно также найти в документации по Bash.
Подстановка результата работы команд
Этот механизм позволяет вместо самой команды подставлять результат, выдаваемый этой командой. Подстановка выполняется в случае, если команда записана следующим образом:
или, например, внутри обратных кавычек:
Bash выполняет команду COMMAND и заменяет COMMAND стандартным выводом этой команды, причем завершающие символы новой строки удаляются. Символы новой строки, находящиеся внутри строк, не удаляются, но они могут быть удалены в процессе разбиения строки на отдельные слова.
franky ~> echo `date` Thu Feb 6 10:06:20 CET 2003
Когда применяется старый формат записи с использованием обратных слешей, обратные слеши сохраняются за исключением случаев, когда за ними следует символ «$», «`» или «\». Первая обратная кавычка, которой не предшествует обратный слеш, закрывает процедуру подстановки результата работы команд. Если используется формат «$(COMMAND)», то все символы, находящиеся между скобками, представляют собой команду и не рассматриваются отдельно.
Это механизм подстановки допускает вложенность. Вложенность возникает, когда используется формат с обратными кавычками, причем действие внутренних обратных кавычек отменяется при помощи символа обратного слеша.
Если подстановка появляется внутри двойных кавычек, то в ее результатах не производится разбиение на отдельные слова и не производятся замены в именах файлов.
Арифметические выражения
Bash позволяет вычислять арифметические выражения и подставлять полученный результат. Формат записи арифметических выражений следующий:
Выражение EXPRESSION рассматривается как если бы оно было указано в двойных кавычках, но двойные кавычки, находящиеся внутри круглых скобок, не рассматриваются как специальные символы. Для всех лексем, имеющихся в выражении, осуществляется подстановка параметров и результатов работы команд, а также удаляются кавычки. Допускается вложенность процедуры вычисления арифметических выражений и подстановки результатов.
Вычисление арифметических выражений осуществляется для целых чисел фиксированной разрядности без проверки на переполнение, но деление на ноль отлавливается и распознается как ошибка. Операторы приблизительно такие же, как и в языке программирования C. Их список в порядке убывания приоритета выглядит следующим образом:
Таблица 3.4. Арифметические операторы
Пост-инкремент и пост-декремент переменной
Пред-инкремент и пред-декремент переменной