Поиск по сайту:

Как использовать Brace Expansion в оболочке Linux Bash


Расширение фигурных скобок — полезный метод для создания списков строк, которые можно использовать в сценариях и псевдонимах, а также в командной строке Linux. Экономьте время и избегайте ошибок, печатая меньше.

Расширение скобки

Прежде чем оболочка Bash выполнит команду в окне терминала или строку в сценарии, она проверяет, нужно ли выполнять какие-либо замены в команде. Имена переменных заменяются их значениями, псевдонимы заменяются командами, для которых они являются сокращением, и выполняется любое расширение. Расширение фигурной скобки — это одна из форм расширения, поддерживаемая Bash.

Расширение фигурной скобки доступно в современных оболочках, но может отсутствовать в некоторых старых оболочках. Если вы собираетесь использовать раскрытие фигурных скобок в сценариях, убедитесь, что вы вызываете оболочку, поддерживающую раскрытие фигурных скобок, например Bash:

#!/bin/bash

Мы будем использовать Bash для наших примеров.

Генерация списков строк может показаться скорее новинкой, чем преимуществом, но она предлагает некоторые функции, которые могут сэкономить время и количество нажатий клавиш. Часто он может обеспечить простое и элегантное решение проблемы или требования.

Простые расширения

Раскрытие фигурной скобки содержится между парой фигурных скобок «{}». Это может быть список элементов, разделенных запятыми, или спецификатор диапазона. Пробелы внутри фигурных скобок запрещены, если только вы не заключили строку в кавычки «\».

Для списка, разделенного запятыми, процесс расширения берет каждый элемент по очереди и передает его вызывающей команде. В этом примере это echo , который просто печатает их в окне терминала. Обратите внимание, что запятые игнорируются.

echo {one,two,three,four}

Список может состоять из слов или цифр.

echo {1,2,3,4}

Порядок элементов списка совершенно произвольный.

echo (4,2,3,1)

Диапазон расширения имеет начальный и конечный символы, соединенные двумя точками «..» без пробелов. Все отсутствующие элементы списка предоставляются расширением автоматически, так что создается весь диапазон от начального до конечного символа.

Это напечатает цифры от 1 до 10.

echo {1..10}

Нумерация произвольная. Не обязательно начинать с одного.

echo {3..12}

Диапазоны можно указать так, чтобы они шли в обратном направлении. Это создаст список от пяти до одного.

echo {5..1}

Диапазоны могут включать отрицательные числа.

echo {4..-4}

Как мы указывали ранее, диапазон имеет начальный и конечный символ. Это не обязательно должно быть число. Это может быть письмо.

echo {q..v}

Буквы могут идти и в обратном направлении.

echo {f..a}

Использование расширения фигурной скобки с циклами

Вы можете использовать расширение скобок с диапазонами в циклах в скриптах.

for i in {3..7}
do
   echo $i
done

Диапазоны раскрытия фигурных скобок позволяют использовать символы в качестве переменной цикла.

for i in {m..q}
do
   echo $i
done

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

for i in {3..7}; do echo $i; done
for i in {m..q}; do echo $i; done

Объединение и вложение

Два смежных расширения не действуют независимо одно за другим. Они взаимодействуют. На каждый элемент первого расширения действует каждый элемент второго расширения.

echo {q..v}{1..3}

Расширения также могут быть вложенными. Вложенное расширение будет действовать на элемент, непосредственно предшествующий ему.

echo {part-1,part-2{a,b,c,d},part-3}

Вы также можете вложить расширения, создав список расширений диапазона, разделенных запятыми.

echo {{5..0},{1..5}}

Преамбула и постскриптум

Вы можете поместить текст до и после раскрытия фигурной скобки, чтобы этот текст был включен в результаты раскрытия. Текст, помещенный перед расширением, называется преамбулой, а текст, помещенный за расширением скобки, называется постскриптумом.

Эта команда использует преамбулу.

echo chapter{1..3}

В этом примере используется постскриптум:

echo {contents,paper,bilbiography}.md

И эта команда использует оба.

echo chapter-{1..4}.md

Расширение имен файлов и каталогов

Как вы уже, наверное, догадались, одно из основных применений раскрытия фигурных скобок — создание имен файлов и каталогов, которые могут быть переданы другим командам. Мы использовали echo как удобный способ увидеть, что именно происходит, когда запускается расширение. Вы можете заменить любую команду, которая принимает имена файлов или каталогов в качестве входных данных, и использовать с ней раскрытие фигурных скобок.

Чтобы быстро создать несколько файлов, используйте touch:

touch file-{1..4}.txt
ls *.txt

Если у вас есть много файлов с одинаковым базовым именем, но разными расширениями файлов, и вы хотите выполнить операцию над их подмножеством, могут помочь раскрытия фигурных скобок. Здесь мы сжимаем подмножество файлов с именем «program» в качестве базового имени в ZIP-файл с именем «source-code.zip».

Каталоги разработки содержат множество файлов, которые будут иметь то же базовое имя, что и ваша основная программа. Обычно вы не хотите создавать резервные копии или распространять файлы, такие как объектные файлы «.o». Это удобный способ включить только интересующие типы файлов.

zip source-code program{.c,.h,.css}

Эта команда сделает копию файла и добавит к нему «.bak», создав резервную копию исходного файла. Интересно отметить, что раскрытие фигурных скобок содержит список, разделенный запятыми, но первый элемент пуст. Если бы мы не поставили запятую, расширения бы не произошло.

cp brace/new/prog-1.c{,.bak}
ls brace/new/prog-1.c.bak

Чтобы выполнить какое-либо действие над двумя файлами в разных каталогах, мы можем использовать расширение фигурной скобки в пути к файлам.

В этом примере каталог «brace» содержит два подкаталога, один из которых называется «новый», а другой — «старый». Они содержат разные версии одного и того же набора файлов исходного кода. Мы воспользуемся программой diff, чтобы увидеть различия между двумя версиями «prog-1.c».

diff brace/{new,old}/prog-1.c

Если у вас есть стандартный набор каталогов, которые необходимо создать в начале проекта, вы можете быстро создать их, используя расширение фигурных скобок. Параметр  mkdir -p (родительский) создает все отсутствующие родительские каталоги при создании дочернего каталога.

mkdir -p {source,build,man,help{/pages,/yelp,/images}}
tree

Вы можете использовать расширение скобок с wget для загрузки нескольких файлов.

В этой команде мы собираемся загружать файлы из двух каталогов с именами «test1» и «test2». Каждый каталог содержит два файла с именами «picture1» и «picture2».

wget https://www.URL-of-your-choice.com/test{1,2}/picture{001,002}.jpg

Список файлов показывает, какие файлы были получены, и как wget переименовывает файлы, чтобы избежать конфликтов имен с существующими файлами.

ls picture*.*

Примите скобу

Попробуйте, и, возможно, он найдет свое место в вашем наборе приемов командной строки.