Механизмы подстановки в Linux. Как сократить ввод команд за счет специальных конструкций?

механизмы подстановки в linux. как сократить ввод команд за счет специальных конструкций?

Введение в механизмы подстановки

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

Как и следовало ожидать, командная оболочка Linux имеет встроенные инструменты, позволяющие упростить такого рода действия. Они называются джокерными символами или механизмами подстановки.

touch ~/{first,second}-file.txt

Откройте терминал и запустите пример, приведенный выше. Результатом его выполнения будет создание в домашней директории двух файлов с именами first-file.txt и second-file.txt. Как видите, запись команды уместилась в одну строку, но произошло две операции. Это стало возможным за счет использования механизмов подстановки.

Список подстановочных конструкций:

Конструкция Действие
[abc] Подставляет вместо себя любой из символов, указанных в квадратных скобках.
[a-z] Подставляет вместо себя любой из символов, входящих в диапазон.
[!abc] Соответствует любому символу, кроме указанных в квадратных скобках.
[^abc] Аналогично предыдущей конструкции.
~ Используется для обозначения домашнего каталога текущего пользователя. Например, вместо записи /home/user-name можно просто ввести ~.
. Подменяет себя на адрес текущего каталога.
.. Соответствует адресу каталога, лежащего на уровень выше.
? Любой возможный символ, но только один.
* Любое количество всевозможных символов.
** Любые файлы и каталоги, включая подкаталоги.
ab{1,2,3} Соответствует ручному вводу трех последовательностей ab1, ab2 и ab3. Динамически подставляемая часть указывается в фигурных скобках через запятую.
ab{1..3} Аналогично предыдущей конструкции, но динамическая часть формируется из последовательности. Пример соответствует ручному вводу ab1, ab2 и ab3.
$[150/10] Арифметическая операция. Подстановочная конструкция будет заменена числом 15. Выражение записывается внутри квадратных скобок, перед которыми должен располагаться символ $.
`команда` Заменяет себя результатом выполнения команды. Так можно использовать одни команды внутри других.
$(команда) Альтернативная запись предыдущей конструкции.
$переменная Подставляет вместо себя значение ранее определенной переменной.
${переменная} Альтернативная запись предыдущей конструкции.
команда "текст" Двойные кавычки отменяют обработку любых специальных символов кроме подстановки переменных.
команда 'текст' Аналогично предыдущей конструкции, но с отменой обработки переменных.

Заметка
Использование механизмов подстановки Linux с первого взгляда может показаться сложным и непривычным. После непродолжительной практики вы измените свое мнение. Данный инструментарий очень полезен и легок в использовании. Общий принцип действия заключается в том, что они заменяют себя на результат выполнения.

Подстановка имен файлов

При осуществлении файловых операций очень удобно использовать подстановочные символы «*», «**» и «?». Например, для удаления всех файлов, чьи имена заканчиваются на .temp, можно использовать следующую команду «rm путь_директории/*.temp».

Охват имен файлов, отличающихся одним символом, можно осуществить командой «rm путь_директории/dump?.sql». Это полезно если к имени файла дописывается число, соответствующее его версии. Например, dump1.sql и dump9.sql. Однако такая команда не сработает, если версия состоит из двух чисел. В таком случае нужно использовать комбинацию из подстановочных конструкций «[0-9]*». Она соответствует любому количеству символов, входящих в диапазон от нуля до девяти.

Символ «**» похож по принципу действия на «*», но захватывает и все подкаталоги. Например, приведенная выше команда с использованием «**» осуществит удаление файлов не только в указанном каталоге, но и во всех подкаталогах.

rm ~/some-directory/*.temp
rm ~/some-directory/**.temp
rm ~/some-directory/dump[0-9]*.sql

Арифметические выражения

Linux позволяет производить арифметические вычисления при использовании механизмов подстановки с помощью конструкции «$[операция]». Её применение не требует особых пояснений. Мы перечислим лишь список доступных операций и приведем пару примеров.

Доступные арифметические операции:

  • + - сложение
  • - - вычитание
  • * - умножение
  • / - деление
  • % - деление по модулю
echo результат вычисления: $[(1500/2)+12]
результат вычисления: 762

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

Образование последовательностей

Фигурные скобки и значения, заданные внутри них через запятую заменяются всевозможными сочетаниями символов. Например, выражение «{a, b, c}» будет соответствовать отдельным записям «a b c», а сочетание последовательностей «{a,b,c}{d,e,f}» заменяется на «ad ae af bd be bf cd ce cf».

Этот механизм подстановки зачастую применяется при создании файлов или каталогов. Так команде touch можно строго задать директорию, а вместо имени файла использовать конструкцию последовательности.

touch /home/some-user/{first,second}-file.txt
echo результат вычисления: $[{1500,750,325}/2]
результат вычисления: 750 375 162

Специальные символы в строках

Проблема заключается в том, что терминал принимает некоторые символы за управляющие конструкции, которые подлежат специфичной обработке. Например, символ «*», изученный выше, имеет особую значимость. Как быть если вам нужно передать программе параметр, в котором содержится данный символ?

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

test-variable=$[123*6]
echo "Мы записали в переменную число - $variable"
Мы записали в переменную число — 738
echo 'Мы записали в переменную число - $variable'
Мы записали в переменную число - $variable

Подстановка результата команды

Иногда требуется передать программе в качестве параметра результат выполнения другой команды. Для этого можно использовать программные каналы, изученные в предыдущих уроках, но самым гибким способом является специальный механизм подстановки обратных кавычек «``».

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

ls -l `find /etc -name '*.conf'` | head
-rw-r--r-- 1 root root 3028 апр 21 2016 /etc/adduser.conf
-rw-r--r-- 1 root root 7339 июн 18 2016 /etc/apache2/apache2.conf
-rw-r--r-- 1 root root 315 мар 19 2016 /etc/apache2/conf-available/charset.conf
-rw-r--r-- 1 root root 127 авг 11 2013 /etc/apache2/conf-available/javascript-common.conf
...

Последние публикации