Table of Contents
Bash Подстановка
Подстановка путей
Механизм работы групповых символов называется подстановкой пути (pathname expansion).
Допустим, содержимое домашней директории выглядит вот так:
ls Out.txt nginx-1.19.0 openssl-1.1.1g.tar.gz pcre-8.44.tar.gz zlib-1.2.11.tar.gz bootstrap-5.0.0-examples.zip nginx-1.19.0.tar.gz out_bash v4.0.0.zip fot_test node_modules package-lock.json years in openssl-1.1.1g pcre-8.44 zlib-1.2.11
Выполнить следующую подстановку:
echo n* nginx-1.19.0 nginx-1.19.0.tar.gz node_modules
Либо
echo *s node_modules years
Либо так
echo [[:upper:]]* Out.txt
Посмотрим за пределы домашнего каталога
echo /usr/*/share /usr/local/share
Подстановка путей для скрытых файлов
Файлы с именами, начинающимися с точки, считаются скрытыми. Механизм подстановки пути также учитывает это. Подстановка, такая как
echo *
Не покажет скрытые файлы.
На первый взгляд кажется, что можно было бы включить скрытые файлы в подстановку, добавив в начало шаблона точку, например:
echo .* . .. .bash_history .bashrc .config
Такой подход даст желаемое. Однако, если внимательно исследовать результаты, можно заметить, что в них также присутствуют имена <html>.</html> (точка) и <html>..</html> (две точки). Так как эти имена соответствуют текущему рабочему каталогу и родительскому каталогу, применение такого шаблона может привести к неправильным результатам. В этом можно убедится выполнив следующею команду
ls -d .* | less
Чтобы обеспечить правильную подстановку пути в такой ситуации, следует использовать специализированный шаблон. Следующий шаблон действует правильно:
ls -d .[!.]?*
Подстановка тильды
Если тильда используется в начале слова, то замещается именем домашнего каталога указанного пользователя или, если пользователь не указан, именем домашнего каталога текущего пользователя:
echo ~ /home/username
Если в системе существует учетная запись пользователя johndoe, тогда
me@linuxbox ~]$ echo ~johndoe /home/johndoe
Подстановка фигурных скобок
Шаблоны с фигурными скобками могут содержать начальную часть, которая называется преамбулой, и заключительную часть, которая называется эпилогом.
Внутри фигурных скобок находится список строк, разделенных запятыми, или диапазон целых чисел или одиночных символов. Использование пробелов внутри фигурных скобок не допускается. Ниже приводится пример с использованием диапазона целых чисел:
echo Number_{1..3} Number_1 Number_2 Number_3
C версии bash 4.0 и выше целые числа можно дополнять ведущими нулями, например:
echo Number_{01..3} Number_01 Number_02 Number_03 echo Number_{0001..3} Number_0001 Number_0002 Number_0003
В данном примере используется диапазон символов в обратном порядке:
echo {Z..A} Z Y X W V U T S R Q P O N M L K J I H G F E D C B A
Пример, как это может пригодиться в реальной жизни. Создадим группу директорий с именами, состоящими из номера года и месяца
mkdir {2020..2021}-{1..12} ls 2020-1 2020-11 2020-2 2020-4 2020-6 2020-8 2021-1 2021-11 2021-2 2021-4 2021-6 2021-8 2020-10 2020-12 2020-3 2020-5 2020-7 2020-9 2021-10 2021-12 2021-3 2021-5 2021-7 2021-9
Перемещение файла
touch day_30.05.txt mv -v day_30.05{,.21}.txt renamed 'day_30.05.txt' -> 'day_30.05.21.txt'
Подстановка результатов арифметических выражений
Командная оболочка поддерживает также подстановку результатов арифметических выражений. Это позволяет использовать командную строку как калькулятор:
echo $((2+2)) 4
Для подстановки арифметических выражений используется следующий формат – <html>$1)</html>. Где выражение – это арифметическое выражение, состоящее из значений и арифметических операторов.
Механизм подстановки арифметических выражений позволяет использовать только целые (невещественные) числа.
Оператор | Описание |
---|---|
<html>+</html> | Сложение |
<html>-</html> | Вычитание |
<html>*</html> | Умножение |
<html>/</html> | Деление (но, из-за того, что подстановка поддерживает только целочисленную арифметику, результатом будет целое число) |
<html>%</html> | Деление по модулю или остаток от деления |