- Linux двойные фигурные скобки
- Что означают фигурные скобки в командной строке?
- Раскрытие фигурных скобок
- Осторожно, скобки раскрываются
- Linux двойные фигурные скобки
- Раскрытие фигурных скобок
- Замена символа «тильда»
- Подстановка значений праметров и переменных командной оболочки
- Подстановка результата работы команд
- Арифметические выражения
- Подстановка процессов
- Разбиение на слова
- Подстановки имен файлов
Linux двойные фигурные скобки
Библиотека сайта rus-linux.net
Что означают фигурные скобки в командной строке?
Фигурные скобки <по-английски - brace>это один из условных знаков, помогающих сократить количество писанины в командной строке.
Формально они входят в число семи expansions (расширение, раскрытие), применяемых в командной строке шелла bash.
Что это за расширения такие? По-русски их лучше всего назвать сокращениями, как это ни странно. Смотрите сами: всем известная тильда (
), будучи напечатана в командной строке, раскроется в путь к нашему домашнему каталогу:
Вот и выходит, что тильда является сокращением адреса /home/имя_пользователя.
Из всех семи сокращений bash, данная статья будет посвящена только фигурным скобкам.
Раскрытие фигурных скобок
(вместо троеточия впишем имена всех промежуточных каталогов).
А можем привлечь на помощь сокращение — фигурные скобки:
Проделайте этот опыт и сами убедитесь, что в рабочей директории появилось 12 новых каталогов. Чтобы они нам в дальнейшем не мешали, удалим их:
Проверьте — их больше нет.
Однако интуиция подсказывает, что должен существовать и более короткий путь, и этот путь, конечно, есть:
А для более сложных сочетаний даже:
Это, сами понимаете, для выборочного создания директорий.
Чтобы закончить с этим примером, отметим, что в выражении фото_<01,02,03,04,05,06,07,08,09,10,11,12>_2009, часть выражения фото_ будет называться префиксом (а по-нашему — приставкой), а _2009 называется суффиксом (или окончанием).
Вот еще пример применения фигурных скобок:
Нужно изменить права доступа к нескольким файлам: old, current и new, находящимся в одной директории:
Мы применили фигурные скобки, чтобы не писать имена и пути (path) всех трех файлов полностью.
Осторожно, скобки раскрываются
Правило 1. Внутри фигурных скобок не должно быть пробелов, так как шелл воспринимает пробел как разделитель. Строго говоря, кроме пробела существуют и другие разделители, например точка с запятой, но мы сейчас касаться их не будем, чтобы не отклониться в сторону.
Например, мы можем создать файлы пес.txt и кот.txt командой:
И они будут благополучно созданы.
Но, стоит внутрь фигурных скобок проникнуть пробелу, как начнется нечто несуразное:
Проверим, что вышло:
Мы получили два файла, но с совершенно невообразимыми именами!
Правило 2. При раскрытии фигурных скобок никакой сортировки объектов не происходит, и они интерпретируются в том же порядке, в каком указаны внутри фигурных скобок.
Имеется в виду, конечно, не сортировка файлов в алфавитном или ином порядке; команда ls, при помощи которой мы просматриваем содержимое директорий, автоматически сортирует файлы по алфавиту. Также поступает и любой менеджер файлов, захоти мы просмотреть рабочую директория в графическом интерфейсе. Например, команда touch создает файлы в алфавитном порядке, независимо от того, как мы разместим их в фигурных скобках:
Отключим сортировку в команде ls:
Все равно, файлы создаются в том же порядке.
Правило 2 говорит о другой сортировке — о том, что при раскрытии фигурных скобок, действия над объектами выполняются в том же порядке, в каком они записаны внутри фигурных скобок, и считывание происходит, как и положено, слева направо (в порядке чтения). Вот пример:
Порядок подстановки сохранен, и получившиеся слова сохраняют порядок, в котором их части находились внутри фигурных скобок.
Есть случаи, когда это свойство фигурных скобок приобретает важное значение. Скажем, мы решили отредактировать файл /etc/X11/xorg.conf. Перед этим обычно создают его резервную копию. Мы воспользуемся для этого фигурными скобками.
Только пойдем на подстраховку — чтобы не проводить обучение с реальным файлом /etc/X11/xorg.conf, что может закончиться печально, мы создадим в домашней директории папку Опыт:
и сразу перейдем в нее:
Проверим, все ли в порядке:
Теперь, в этой папке, мы можем создавать, изменять и уничтожать любые файлы, и ничего нам за это не будет.
Итак, создадим файл xorg.conf:
Теперь создадим его резервную копию, применяя фигурные скобки:
Допустим, наши изменения в файле xorg.conf были неудачны, и мы решили вернуть на его место сохраненную копию. Для этого мы можем применить почти ту же команду, что и для резервного копирования, изменив только последовательность выражений в фигурных скобках:
Команда cp запрашивает подтверждения, мы нажимаем ENTER, и дело сделано: файл xorg.conf переписан файлом xorg.conf.bak.
Нужно только не забывать, что шелл интерпретирует команду:
Поэтому порядок объектов внутри фигурных скобок чрезвычайно важен.
Правило 3. При раскрытии фигурных скобок шелл рассматривает все символы внутри фигурных скобок как простые символы, а не как метасимволы или символы регулярных выражений.
Поэтому, хотя команда
Удалит из текущей директории все файлы типа file1, file2, fileN, file_file и подобные,
удалит только два файла file* и file1, то есть астериск (*) будет интерпретирован как простая звездочка.
Правило 4. Если нужно поместить внутри фигурных скобок выражения, содержащие фигурные скобки, или запятые, то необходимо экранировать эти символы обратным слэшем (/), а если нужно ввести сам обратный слэш, то его экранируют вторым обратным слэшем:
Данная статья, как явствует из ее названия, посвящена только применению фигурных скобок в командной строке bash. Они применяются также в скриптах bash, но эта тема далеко выходит за рамки нашего сегодняшнего рассмотрения.
Источник
Linux двойные фигурные скобки
После того, как команда будет разделена на отдельные лексемы (смотрите раздел «Синтаксис командной оболочки»), над этими лексемами или словами могут быть выполнены дополнительные замены или подстановки значений. Есть восемь видов таких дополнительных действий, которые мы рассматриваем в следующих разделах в той последовательности, в какой они применяются к лексемам.
После выполнения всех этих действий, происходит удаление кавычек.
Раскрытие фигурных скобок
Раскрытие фигурных скобок — это механизм, с помощью которого можно генерировать строки произвольного вида. В шаблонах, которые при этом используются, может присутствовать необязательное НАЧАЛО, за которым между фигурными скобками идет последовательность строк, разделенных запятыми. Затем идет необязательное ЗАВЕРШЕНИЕ. Начало является префиксом всех строк, генерация которых задана внутри фигурных скобок, а завершение просто добавляется к концу каждой строки, полученной перебором слева направо строк, указанных внутри скобок.
Допускается вложенность фигурных скобок. Полученные результаты не сортируются; сохраняется порядок, определенный перебором слева направо:
Фигурные скобки обрабатываются раньше всех других дополнительных подстановок. В полученном результате сохраняются все символы, предназначенные для следующих подстановок. Обработка строго текстовая. Bash не осуществляет интерпретацию каких-либо синтаксических конструкций, расположенных внутри фигурных скобок. Чтобы избежать конфликтов, связанных с подстановкой параметров, строка «$<" при обработке фигурных скобок игнорируется.
Правильно сформированный шаблон должен иметь открывающую и закрывающую фигурную скобку, причем они не должны быть в кавычках, и, по крайней мере, одну запятую, которая также не должна быть в кавычках. Любой неправильно сформированный шаблон обрабатываться не будет.
Замена символа «тильда»
Если слово начинается с символа «тильда» («
«), который не должен быть в кавычках, то все символы до первого слеша, который также не должен быть в в кавычках, (или все символы, если слеш без кавычек отсутствует) считаются префиксом тильды. Если в префиксе тильды нет символов, заключенных в кавычки, то символы, следующие за тильдой, трактуются как возможное имя для входа в систему. Если это имя является пустой строкой, то тильда заменяется на значение переменной окружения HOME. Если значение переменной HOME не установлено, то вместо него подставляется название домашнего директория пользователя, исполняющего командную оболочку. Иначе префикс тильды заменяется названием домашнего директория, связанного с указанным именем входа в систему.
Если префиксом тильды будет «
+», то он будет заменен значением переменной PWD. Если префиксом тильды будет «
-«, то он будет заменен значением переменной OLDPWD, если это значение установлено.
Если символы, следующие после тильды в префиксе тильды, состоят из числа N с необязательным префиксом «+» или «-«, тильда-префикс заменяется элементом из стека директориев, точно таким, какой будет отображаться встроенной командой dirs с аргументом, которым будут символы, следующие после тильды в префиксе тильды. Если в префиксе тильды, кроме символа тильды, указывается только число без предваряющего символа «+» или «-«, то подразумевается символ «+».
Если имя входа в систему неверное или если возникли проблемы в обработке тильды, то слово с тильдой не изменяется.
Для каждой операции присваивания переменной значения проверяется, присутствует ли сразу после символов «:» или «=» префикс тильды, не заключенный в кавычки. Если присутствует, то и в этом случае делается попытка замены тильды. Таким образом, при присваивании значений переменным PATH , MAILPATH и CDPATH можно использовать имена файлов с тильдой и оболочка выполнит такое присваивание с предварительной заменой тильды.
/testdir будет заменена на строку $HOME/testdir , так что если $HOME равно /var/home/franky , в переменную PATH будет добавлен директорий /var/home/franky/testdir .
Подстановка значений праметров и переменных командной оболочки
Символ «$» позволяет указывать параметры, осуществлять подстановку результата работы команд или выполнять замену арифметических выражений результатом их вычисления. Имя параметра или символ, для которого будет выполняться подстановка, может быть заключен в фигурные скобки, которые не являются обязательными, но служат для того, чтобы к переменной не добавлялись символы, идущие сразу после переменной, которые могут быть проинтерпретированы как часть имени.
Когда используются фигурные скобки, закрывающей фигурной скобкой будет считаться первая «>», перед которой не проставлен обратный слеш, а сама скобка не находится внутри кавычек, не является частью арифметического выражения и не появляется в результате выполнения команд или подстановки параметров.
Обычным форматом для подстановки параметра является «$
Если первым символом имени «PARAMETER» является восклицательный знак, то Bash вначале производит все подстановки и замены в строке, сформированной из оставшейся части «PARAMETER», рассматриваемой как имя переменной; затем происходит подстановка значений и в дальнейшем при подстановках используется это значение, а не значение самого имени «PARAMETER». Этот механизм известен как косвенная подстановка.
Вы наверняка знакомы с непосредственной подстановкой значений параметров, поскольку она выполняется всегда, даже в самых простых случаях, в тех примерах, что были приведены ранее или в следующих:
Ниже приведен пример косвенной подстановки:
Обратите внимание, что это не то же самое, что и echo $N* .
В следующем примере создается поименованная переменная в случае, если она еще не существует:
Однако специальные параметры, которые могут находиться среди других позиционных параметров, передавать таким образом нельзя.
Мы еще будем рассматривать использование фигурных скобок при работе с переменными в главе 10 «Подробнее о переменных». Более подробную информацию можно также найти в документации по Bash.
Подстановка результата работы команд
Этот механизм позволяет вместо самой команды подставлять результат, выдаваемый этой командой. Подстановка выполняется в случае, если команда записана следующим образом:
или, например, внутри обратных кавычек:
Bash выполняет команду COMMAND и заменяет COMMAND стандартным выводом этой команды, причем завершающие символы новой строки удаляются. Символы новой строки, находящиеся внутри строк, не удаляются, но они могут быть удалены в процессе разбиения строки на отдельные слова.
Когда применяется старый формат записи с использованием обратных слешей, обратные слеши сохраняются за исключением случаев, когда за ними следует символ «$», «`» или «\». Первая обратная кавычка, которой не предшествует обратный слеш, закрывает процедуру подстановки результата работы команд. Если используется формат «$(COMMAND)», то все символы, находящиеся между скобками, представляют собой команду и не рассматриваются отдельно.
Это механизм подстановки допускает вложенность. Вложенность возникает, когда используется формат с обратными кавычками, причем действие внутренних обратных кавычек отменяется при помощи символа обратного слеша.
Если подстановка появляется внутри двойных кавычек, то в ее результатах не производится разбиение на отдельные слова и не производятся замены в именах файлов.
Арифметические выражения
Bash позволяет вычислять арифметические выражения и подставлять полученный результат. Формат записи арифметических выражений следующий:
Выражение EXPRESSION рассматривается как если бы оно было указано в двойных кавычках, но двойные кавычки, находящиеся внутри круглых скобок, не рассматриваются как специальные символы. Для всех лексем, имеющихся в выражении, осуществляется подстановка параметров и результатов работы команд, а также удаляются кавычки. Допускается вложенность процедуры вычисления арифметических выражений и подстановки результатов.
Вычисление арифметических выражений осуществляется для целых чисел фиксированной разрядности без проверки на переполнение, но деление на ноль отлавливается и распознается как ошибка. Операторы приблизительно такие же, как и в языке программирования C. Их список в порядке убывания приоритета выглядит следующим образом:
Таблица 3.4. Арифметические операторы
Оператор | Что означает |
Подстановки и разбиение на слова | |