Вход/Регистрация
UNIX — универсальная среда программирования
вернуться

Керниган Брайан Уилсон

Шрифт:

3.2 Метасимволы

Интерпретатор распознает еще ряд символов как специальные. Наиболее часто используется звездочка

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

$ echo *

есть не что иное, как некое подобие команды

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

$ ls

.profile

junk

temp

$ echo *

junk temp

$ echo .*

. .. .profile

$

Символы со специальным значением, подобные

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

>
prog > file
— переключить стандартный выходной поток в файл
>>
prog >> file
— добавить стандартный выходной поток к файлу
<
prog < file
— извлечь стандартней выходной поток из файла
|
p1 | p2
— передать стандартный выходной поток
p1
как стандартный выходной поток для
p2
<<str
"Документ здесь": стандартный выходной поток задается в последующих строках до строки, состоящей из одного символа
str
*
Задает любую строку, состоящую из нуля или более символов, в имени файла
?
Задает любой символ в имени файла
[ccc]
Задает любой символ из
[ccc]
в имени файла (допустимы диапазоны, такие, как
0-9
или
a-z
)
;
Завершает команды:
p1; p2
— выполнить
p1
, затем
p2
&
Выполняет аналогичные функции, но не ждет окончания
p1
`...`
Инициирует выполнение команд(ы) в
...
;
`...`
заменяется своим стандартным выводом
(...)
Инициирует выполнение команд(ы) в
...
в порожденном
shell
{...}
Инициирует выполнение команд(ы) в
...
в текущем вызове shell (используется редко)
$1, $2, ...
Заменяются аргументами командного файла
$var
Значение переменной
var
в программе на языке
shell
${var}
Значение
var
; исключает коллизии в случае конкатенации переменной с последующим текстом (см. также табл. 5.3)
\
\c
— использовать непосредственно символ
c
,
\
перевод строки отбрасывается
'...'
Означает непосредственное использование
"..."
Означает непосредственное использование, но после того, как
$
,
`...`
и
\
будут интерпретированы
#
В начале слова означает, что вся остальная строка рассматривается как комментарий (но не в седьмой версии)
var=value
Присваивает
value
переменной
var
p1 && p2
Предписывает выполнить
p1
; в случае успеха выполнить
p2
p1 || p2
Предписывает выполнить
p1
; в случае неудачи выполнить
p2

Таблица 3.1: Метасимволы

shell

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

$ echo '* * *'

* * *

$

Можно также использовать кавычки

"..."
, но интерпретатор на самом деле "заглядывает" внутрь этих кавычек в поиске метасимволов
$
,
'...'
и
\
, так что не применяйте
"..."
, если только вам не требуется определенным образом обработать строку в кавычках.

Еще одну возможность дает ввод обратной дробной черты перед каждым символом, который вы хотите закрыть от интерпретатора, например:

$ echo \*\*\*

Хотя строка

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

Кавычки одного вида могут экранировать кавычки другого вида:

$ echo "Don't do that!"

Don't do that!

$

и могут не заключать в себе весь аргумент:

$ echo x'*'y

x*y

$ echo '*'A'?'

*А?

$

В последнем примере команда

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

$ echo 'hello

> world'

hello

world

$

Символ

>
является вторичным приглашением интерпретатора, которое выдается, если ожидается продолжение ввода для завершения команды. В этом примере апостроф в первой строке должен быть уравновешен другим апострофом. Вторичное приглашение интерпретатора хранится в переменной
PS2
; его можно изменить по своему вкусу.

Во всех приведенных выше примерах экранирование специальных символов предохраняет их от интерпретации. Команда

$ echo x*y

выдает все имена файлов, начинающиеся с

x
и кончающиеся
y
. Как обычно, команда
echo
ничего "не знает" ни о файлах, ни о метасимволах; интерпретация
*
, если она требуется, осуществляется
shell
.

Что произойдет, если ни один файл не будет соответствовать шаблону? Интерпретатор просто пропустит строку, как если бы она была взята в кавычки, а не выразит вам свое неудовольствие (как было принято в ранних версиях). Конечно, не следует рассчитывать на это свойство, но его можно использовать, чтобы узнать о существовании файлов, соответствующих шаблону:

  • Читать дальше
  • 1
  • ...
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: