Отправляет email-рассылки с помощью сервиса Sendsay

Программирование на shell и awk

  Все выпуски  

О использовании шаблонов имен файлов


Информационный Канал Subscribe.Ru

В примере 8.7 из предыдущего выпуска обнаружена опечатка (Subscribe.ru при отправке рассылки заменил ../.. на ./.), исправленный пример будет таким:
$ pwd
/usr/local/bin

$ cd ../..

$ pwd
/usr

Выпуск #9

О использовании шаблонов имен файлов

Подстановка имен файлов одна из семи замен, которые выполняет bash (в стандартном sh их будет меньше, см. выпуск #4) над полученной от пользователя командной строкой. Эта замена выполняется самой последней и может быть отключена с помощью опции -f, указанной при вызове командного интерпретатора либо команды set.

Любое слово, содержащее символы *, ?, [ будет истолковано shell'ом как шаблон и заменено упорядоченным по алфавиту списком имен файлов, соответствующих шаблону (в отличии от стандартного sh, bash способен различать в шаблонах круглые скобки, если установлена опция extglob; см. также описание опций nocaseglob, dotglob и переменной GLOBIGNORE в русском переводе руководства по bash). Если соответствующие имена файлов не будут найдены, то слово останется без изменений (в bash с помощью опции nullglob можно добиться того, чтобы в таком случае слово удалялось).

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

$ cd      # перемещаемся в начальный каталог

$ echo .* # выводим имена «скрытых» файлов
 . .. .Xdefaults .bash_history .bash_logout .bash_profile .bashrc .mc

$ echo *  # выводим имена остальных файлов
dosfstools-2.2-4.i386.rpm mbox ttd
                                                              Пример 9.1
Короче, любой символ в шаблоне, отличающийся от специальных, описанных ниже, сопоставляется буквально. Специальные символы шаблона для буквального сопоставления необходимо маскировать.
*
Соответствует любой строке, в том числе, пустой.
?
Соответствует любому одиночному символу.
[...]
Соответствует любому символу из перечисленных в квадратных скобках. Такая конструкция называется символьным классом.
Квадратные скобки требуют более детального рассмотрения. К нему и приступим. Внутри квадратных скобок пара символов, разделенная дефисом, задает диапазон — любой символ, лексически находящийся между этими двумя символами, включительно, будет соответствовать этой конструкции. Если сразу после [ идет символ ! или ^ (последний будет работать только в bash), то конструкции соответствует любой символ, не указанный в квадратных скобках.

Для сопоставления с дефисом (-) его необходимо указать в квадратных скобках первым или последним. Для задания закрывающей квадратной скобки (]), ее необходимо указать как первый символ набора. При указании в квадратных скобках метасимволов командного интерпретатора (; & | < > ( ) пробел табуляция) их необходимо экранировать. Также необходимо экранировать символы: ', ", `, \. А в bash еще и !, если он указан не первым.

Чтобы проверить себя, выполните следующие команды и объясните результаты их работы:

$ touch \[ \]

$ ls -l [^[]

$ ls -l [^]]

$ ls -l [][]

$ ls -l [^][]

                                                              Пример 9.2

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

$ uptime | tr [a-z] [A-Z]
 11:48PM  UP 4 MIN,  1 USER,  LOAD AVERAGE: 0.10, 0.10, 0.04

$ touch a b c d

$ uptime | tr [a-z] [A-Z]
tr: too many arguments
Try tr --help' for more information.

$ uptime | tr '[a-z]' "[A-Z]"
 11:49PM  UP 5 MIN,  1 USER,  LOAD AVERAGE: 0.10, 0.10, 0.04
                                                              Пример 9.3

Будьте бдительны!
Не следует использовать шаблон .* при изменении прав доступа к файлу, его владельца или группы. Выполнив, например, команду chown nick .*, находясь в каталоге /home/nick, вы измените не только владельца таких вайлов как .bash_history, .profile .bashrc, .mc, .profile и других, но и для каталогов /home/nick и /home, так как на них ссылаются файлы . и .. !

Подсказка для тех, кто побывал на «Иероглифе» (http://hiero.ru) и не нашел мои фотоработы — они доступны по адресу http://hiero.ru/works.php?author=bs.


Ведущий рассылки Big Shadow

Архив рассылки находится на http://subscribe.ru/archive/comp.soft.prog.shellandawk/



http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное