Red Hat System Administration I 8.2

Сопоставление имен файлов с использованием маски

Задачи

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

Маска командной строки

Оболочка Bash предоставляет несколько способов применения маски в командной строке, включая сопоставление с шаблоном , маску домашнего каталога, маску строки и подстановку переменных. Возможно, самым эффективным из них является возможность сопоставления путей, которую исторически называют подстановкой имен. Функция подстановки имен в Bash, которую иногда называют «метасимволами», упрощает работу с большим количеством файлов. При использовании метасимволов, которые «развертываются» для сопоставления с искомыми именами файлов и путей, команды выполняются применительно к определенному набору файлов.

Сопоставление с шаблоном

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

Таблица 3.3. Таблица метасимволов и соответствий

ШаблонСоответствие
* Любая строка длиной 0 или более символов.
? Любой один символ.
[abc...] Любой один символ в указанном классе символов (в квадратных скобках).
[!abc...] Любой один символ, не указанный в квадратных скобках.
[^abc...] Любой один символ, не указанный в квадратных скобках.
[[:alpha:]] Любой алфавитный символ.
[[:lower:]] Любой символ в нижнем регистре.
[[:upper:]] Любой символ в верхнем регистре.
[[:alnum:]] Любой алфавитный символ или цифра.
[[:punct:]] Любой печатный символ, кроме пробела, буквы или цифры.
[[:digit:]] Любая цифра от 0 до 9.
[[:space:]] Любой один символ пробела. Это могут быть символы табуляции, перевода строки, возврата каретки и перевода страницы, а также пробелы.

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

[user@host ~]$ mkdir glob; cd glob
[user@host glob]$ touch alfa bravo charlie delta echo able baker cast dog easy
[user@host glob]$ ls
able  alfa  baker  bravo  cast  charlie  delta  dog  easy  echo
[user@host glob]$ 

В первом примере используются простые метасимволы * (звездочка) и ? (вопросительный знак), а также класс символов для сопоставления некоторых имен файлов.

[user@host glob]$ ls a*
able  alfa
[user@host glob]$ ls *a*
able  alfa  baker  bravo  cast  charlie  delta  easy
[user@host glob]$ ls [ac]*
able  alfa  cast  charlie
[user@host glob]$ ls ????
able  alfa  cast  easy  echo
[user@host glob]$ ls ?????
baker  bravo  delta
[user@host glob]$ 

Развертывание тильды

Символ тильды (~) соответствует домашнему каталогу текущего пользователя. Если с него начинается строка символов, не являющихся косой чертой (/), командная оболочка будет интерпретировать строку до косой черты как имя пользователя, если оно существует, и заменит строку абсолютным путем к домашнему каталогу этого пользователя. Если соответствующее имя пользователя не найдено, будет использоваться фактический символ тильды, за которым следует строка символов.

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

[user@host glob]$ echo ~root
/root
[user@host glob]$ echo ~user
/home/user
[user@host glob]$ echo ~/glob
/home/user/glob
[user@host glob]$ 

Развертывание фигурных скобок

Развертывание фигурных скобок используется для создания самостоятельных строк символов. Фигурные скобки содержат разделенный запятыми список строк или выражение последовательности. Результат включает текст, предшествующий фигурным скобкам или следующий за ними. Развертывания фигурных скобок могут вкладываться друг в друга. Синтаксис с двойной точкой (..) развертывается в последовательность, например {m..p} развертывается в m n o p.

[user@host glob]$ echo {Sunday,Monday,Tuesday,Wednesday}.log
Sunday.log Monday.log Tuesday.log Wednesday.log
[user@host glob]$ echo file{1..3}.txt
file1.txt file2.txt file3.txt
[user@host glob]$ echo file{a..c}.txt
filea.txt fileb.txt filec.txt
[user@host glob]$ echo file{a,b}{1,2}.txt
filea1.txt filea2.txt fileb1.txt fileb2.txt
[user@host glob]$ echo file{a{1,2},b,c}.txt
filea1.txt filea2.txt fileb.txt filec.txt
[user@host glob]$ 

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

[user@host glob]$ mkdir ../RHEL{6,7,8}
[user@host glob]$ ls ../RHEL*
RHEL6 RHEL7 RHEL8
[user@host glob]$ 

Развертывание переменной

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

Вы можете задать данные в качестве значения для переменной с помощью следующего синтаксиса:

[user@host ~]$ VARIABLENAME=value

Используйте развертывание переменной, чтобы преобразовать имя переменной в ее значение в командной строке. Если строка начинается со знака доллара ($), командная оболочка будет интерпретировать оставшуюся часть этой строки как имя переменной и попытается заменить его значением переменной.

[user@host ~]$ USERNAME=operator
[user@host ~]$ echo $USERNAME
operator

Во избежание ошибок в связи с другими развертываниями оболочки можно поместить имя переменной в фигурные скобки, например ${VARIABLENAME}.

[user@host ~]$ USERNAME=operator
[user@host ~]$ echo ${USERNAME}
operator

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

Подстановка команд

Подстановка команд позволяет использовать вывод команды для замены самой команды в командной строке. Подстановка команды происходит, если команда заключена в круглые скобки и перед ней стоит знак доллара ($). Форма $(команда) позволяет вкладывать несколько развернутых команд друг в друга.

[user@host glob]$ echo Today is $(date +%A).
Today is Wednesday.
[user@host glob]$ echo The time is $(date +%M) minutes past $(date +%l%p).
The time is 26 minutes past 11AM.
[user@host glob]$ 

Примечание

В старой форме подстановки команд используются обратные кавычки: `команда`. Форма с обратными кавычками имеет два недостатка: 1) можно легко визуально спутать обратные кавычки с обычными одинарными кавычками, 2) обратные кавычки нельзя вкладывать друг в друга.

Защита аргументов от развертывания

Многие символы имеют специальные значения в командной оболочке Bash. Чтобы оболочка не развертывала части командной строки, можно использовать кавычки и символы экранирования.

Обратная косая черта (\) ― это символ экранирования в оболочке Bash. Она защищает последующий символ от развертывания.

[user@host glob]$ echo The value of $HOME is your home directory.
The value of /home/user is your home directory.
[user@host glob]$ echo The value of \$HOME is your home directory.
The value of $HOME is your home directory.
[user@host glob]$ 

В предыдущем примере защита знака доллара от развертывания привела к тому, что оболочка Bash интерпретировала его как обычный символ и не выполнила развертывания переменной для $HOME.

Для защиты более длинных символьных строк используются одинарные (') и двойные кавычки ("). Их действие немного отличается. Одинарные кавычки останавливают все развертывания командной оболочки. Двойные кавычки останавливают большинство развертываний.

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

[user@host glob]$ myhost=$(hostname -s); echo $myhost
host
[user@host glob]$ echo "***** hostname is ${myhost} *****"
***** hostname is host *****
[user@host glob]$ 

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

[user@host glob]$ echo "Will variable $myhost evaluate to $(hostname -s)?"
Will variable host evaluate to host?
[user@host glob]$ echo 'Will variable $myhost evaluate to $(hostname -s)?'
Will variable $myhost evaluate to $(hostname -s)?
[user@host glob]$ 

Важно

Одинарную кавычку (') легко спутать с обратной кавычкой подстановки команд (`) на экране и на клавиатуре. Использование одной кавычки вместо другой приведет к непредвиденному поведению командной оболочки.

Ссылки

Man-страницы bash(1), cd(1), glob(7), isalpha(3), ls(1), path_resolution(7) и pwd(1)