В примере 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, так как на них ссылаются файлы . и ..
!