Глава 3. Служебные символы

Служебные символы, используемые в текстах сценариев.

#  Комментарии. Строки, начинающиеся с символа # (за исключением комбинации #!) — являются комментариями.

Комментарии могут располагаться и в конце строки с исполняемым кодом.

Комментариям могут предшествовать пробелы (пробел, табуляция).

Исполняемые команды не могут следовать за комментарием в той же самой строке. Пока что еще не существует способа отделения комментария от «исполняемого кода», следующего за комментарием в той же строке.
Само собой разумеется, экранированный символ # в операторе echo не воспринимается как начало комментария. Более того, он может использоваться в операциях подстановки параметров и в константных числовых выражениях.

Кавычки » ‘ и \ экранируют действие символа #.

В операциях поиска по шаблону символ # так же не воспринимается как начало комментария.

;  Разделитель команд. [Точка-с-запятой] Позволяет записывать две и более команд в одной строке.

Следует отметить, что символ «;« иногда так же как и # необходимо экранировать.

;;  Ограничитель в операторе выбора case . [Двойная-точка-с-запятой]

.  команда «точка». Эквивалент команды source. Это встроенная команда bash.
.  «точка» может являться частью имени файла . Если имя файла начинается с точки, то это «скрытый» файл, т.е. команда ls при обычных условиях его не отображает.

<strong>touch .hidden-file</strong> bash$ <strong>ls -l</strong> total 10 -rw-r--r--    1 bozo      4034 Jul 18 22:04 data1.addressbook -rw-r--r--    1 bozo      4602 May 25 13:58 data1.addressbook.bak -rw-r--r--    1 bozo       877 Dec 17  2000 employment.addressbook bash$ <strong>ls -al</strong> total 14 drwxrwxr-x    2 bozo  bozo      1024 Aug 29 20:54 ./ drwx------   52 bozo  bozo      3072 Aug 29 20:51 ../ -rw-r--r--    1 bozo  bozo      4034 Jul 18 22:04 data1.addressbook -rw-r--r--    1 bozo  bozo      4602 May 25 13:58 data1.addressbook.bak -rw-r--r--    1 bozo  bozo       877 Dec 17  2000 employment.addressbook -rw-rw-r--    1 bozo  bozo         0 Aug 29 20:54 .hidden-file[/crayon]

Если подразумевается имя каталога, то одна точка означает текущий каталог и две точки — каталог уровнем выше, или родительский каталог.

<strong>pwd</strong> /home/bozo/projects bash$ <strong>cd .</strong> bash$ <strong>pwd</strong> /home/bozo/projects bash$ <strong>cd ..</strong> bash$ <strong>pwd</strong> /home/bozo/[/crayon]
Символ точка довольно часто используется для обозначения каталога назначения в операциях копирования/перемещения файлов.

<strong>cp /home/bozo/current_work/junk/* .</strong>[/crayon]

.  Символ «точка» в операциях поиска. При выполнении поиска по шаблону , в регулярных выражениях, символ «точка» обозначает одиночный символ.
»  Двойные кавычки . В строке «STRING», ограниченной двойными кавычками не выполняется интерпретация большинства служебных символов, которые могут находиться в строке.
‘  Одинарные кавычки . [Одинарные кавычки] ‘STRING’ экранирует все служебные символы в строке STRING. Это более строгая форма экранирования. Смотрите так же Глава 5.
,  Запятая . Оператор запятая используется для вычисления серии арифметических выражений. Вычисляются все выражения, но возвращается результат последнего выражения.

escape. [обратный слэш] Комбинация <strong>\X</strong> «экранирует» символ X. Аналогичный эффект имеет комбинация с «одинарными кавычками», т.е. ‘X’. Символ \ может использоваться для экранирования кавычек « и .
/  Разделитель, используемый в указании пути к каталогам и файлам. [слэш] Отделяет элементы пути к каталогам и файлам (например /home/bozo/projects/Makefile).
В арифметических операциях — это оператор деления.
 Подстановка команд. [обратные кавычки] Обратные кавычки могут использоваться для записи в переменную команды command`.
:  пустая команда. [двоеточие] Это эквивалент операции «NOP» ( <em>no op</em>, нет операции). Может рассматриваться как синоним встроенной команды true. Команда «:« так же является встроенной командой Bash, которая всегда возвращает «true» (0).

Бесконечный цикл:

Символ-заполнитель в условном операторе if/then:

Как символ-заполнитель в операциях, которые предполагают наличие двух операндов, и параметры по-умолчанию.

Как символ-заполнитель для оператора вложенного документа.

В операциях с подстановкой параметров.

В операциях замены подстроки с подстановкой значений переменных.

В комбинации с оператором > (оператор перенаправления вывода), усекает длину файла до нуля. Если указан несуществующий файл — то он создается.

В комбинации с оператором >> — оператор перенаправления с добавлением в конец файла и обновлением времени последнего доступа ( <strong>: >> new_file</strong>). Если задано имя несуществующего файла, то он создается. Эквивалентно команде touch.

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

Символ : может использоваться для создания комментариев, хотя и не рекомендуется. Если строка комментария начинается с символа #, то такая строка не проверяется интерпретатором на наличие ошибок. Однако в случае оператора : это не так.

Символ «:« может использоваться как разделитель полей в /etc/passwd и переменной $PATH.

<strong>echo $PATH</strong> /usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/sbin:/usr/sbin:/usr/games[/crayon]

инверсия (или логическое отрицание) используемое в условных операторах. Оператор ! инвертирует код завершения команды, к которой он применен. Так же используется для логического отрицания в операциях сравнения, например, операция сравнения «равно» ( = ), при использовании оператора отрицания, преобразуется в операцию сравнения — «не равно» ( != ). Символ !является зарезервированным ключевым словом BASH.
В некоторых случаях символ ! используется для косвенного обращения к переменным.

Кроме того, из командной строки оператор ! запускает механизм историй Bash  Примечательно, что этот механизм недоступен из сценариев (т.е. исключительно из командной строки).

символ-шаблон. [звездочка] Символ * служит «шаблоном» для подстановки в имена файлов. Одиночный символ * означает любое имя файла в заданном каталоге.

<strong>echo *</strong> abs-book.sgml add-drive.sh agram.sh alias.sh[/crayon]
В регулярных выражениях токен * представляет любое количество (в том числе и 0) символов.

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

В выражениях с подстановкой параметра, символ ? проверяет — установлена ли переменная.

символ-шаблон. Символ ? обозначает одиночный символ при подстановке в имена файлов. В регулярных выражениях служит для обозначения одиночного символа.
Подстановка переменной.

Символ $, предшествующий имени переменной, указывает на то, что будет получено значение переменной.

end-of-line (конец строки). В регулярных выражениях, символ «$» обозначает конец строки.
${} Подстановка параметра.
$*, $@ параметры командной строки.
$? код завершения. Переменная $? хранит код завершения последней выполненной команды, функции или сценария.
$$  id процесса. Переменная $$ хранит id процесса сценария.
() группа команд.

Команды, заключенные в <em>круглые скобки</em> исполняются в дочернем процессе — subshell-е.

Переменные, создаваемые в дочернем процессе не видны в «родительском» сценарии. Родительский процесс-сценарий, не может обращаться к переменным, создаваемым в дочернем процессе.

инициализация массивов.

{xxx,yyy,zzz,…} Фигурные скобки.

Команда интерпретируется как список команд, разделенных точкой с запятой, с вариациями, представленными в <em>фигурных скобках</em>.  При интерпретации имен файлов (подстановка) используются параметры, заключенные в фигурные скобки.

Использование неэкранированных или неокавыченных пробелов внутри фигурных скобок недопустимо.

<strong>echo {file1,file2}\ :{\ A," B",' C'}</strong>

file1 : A file1 : B file1 : C file2 : A file2 : B file2 : C

{} Блок кода. [фигурные скобки] Известен так же как «вложенный блок», эта конструкция, фактически, создает анонимную функцию. Однако, в отличии от обычных функций, переменные, создаваемые во вложенных блоках кода, доступны объемлющему сценарию.

<strong>{ local a; a=123; }</strong> bash: local: can only be used in a function[/crayon]

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

Пример 3-1. Вложенные блоки и перенаправление ввода-вывода

Пример 3-2. Сохранение результата исполнения вложенного блока в файл

В отличие от групп команд в (круглых скобках), описаных выше, вложенные блоки кода, заключенные в {фигурные скобки} исполняются в пределах того же процесса, что и сам скрипт (т.е. не вызывают запуск дочернего процесса — subshell).
{} \; pathname — полное имя файла (т.е. путь к файлу и его имя). Чаще всего используется совместно с командой find.
td>

Обратите внимание на то, что символ «;«, которым завершается ключ -exec команды find, экранируется обратным слэшем. Это необходимо, чтобы предотвратить его интерпретацию.
[ ] test.
Проверка истинности выражения, заключенного в квадратные скобки [ ]. Примечательно, что [ является частью встроенной команды test (и ее синонимом), И не имеет никакого отношения к «внешней» утилите /usr/bin/test.
[[ ]] test.
Проверка истинности выражения, заключенного между [[ ]] (зарезервированное слово интерпретатора).
[ ] элемент массива.
При работе с массивами в квадратных скобках указывается порядковый номер того элемента массива, к которому производится обращение.
[ ] диапазон символов.
В регулярных выражениях, в квадратных скобках задается диапазон искомых символов.
(( )) двойные круглые скобки.
Вычисляется целочисленное выражение, заключенное между двойными круглыми скобками (( )).

См. обсуждение, посвященное конструкции (( … )) .

> &> >& >> перенаправление.
Конструкция <strong>scriptname >filename</strong> перенаправляет вывод scriptname в файл filename. Если файл filename уже существовал, то его прежнее содержимое будет утеряно.

Конструкция <strong>command &>filename</strong> перенаправляет вывод команды command, как со stdout, так и с stderr, в файл filename.

Конструкция <strong>command >&2</strong> перенаправляет вывод со stdout на stderr.

Конструкция <strong>scriptname >>filename</strong> добавляет вывод scriptname к файлу filename. Если задано имя несуществующего файла, то он создается.

подстановка процесса.

<strong>(command)></strong>

<strong><(command)</strong>

В операциях сравнения, символы «<« и «>« обозначают операции сравнения строк .

А так же — операции сравнения целых чисел.

<< перенаправление ввода на встроенный документ.
<, Посимвольное ASCII-сравнение.

\<, \> границы отдельных слов в регулярных выражениях.
bash$ <strong>grep '\<the\>' textfile</strong>
конвейер. Передает вывод предыдущей команды на ввод следующей или на вход командного интерпретатора shell. Этот метод часто используется для связывания последовательности команд в единую цепочку.

В конвейер могут объединяться и сценарии на языке командной оболочки.

А теперь попробуем объединить в конвейер команду ls -l с этим сценарием.

<strong>ls -l | ./uppercase.sh</strong> -RW-RW-R--    1 BOZO  BOZO       109 APR  7 19:49 1.TXT -RW-RW-R--    1 BOZO  BOZO       109 APR 14 16:48 2.TXT -RW-R--R--    1 BOZO  BOZO       725 APR 20 20:56 DATA-FILE[/crayon]

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

Конвейер исполняется в дочернем процессе, а посему — не имеет доступа к переменным сценария.

Если одна из команд в конвейере завершается аварийно, то это приводит к аварийному завершению работы всего конвейера.
>| принудительное перенаправление, даже если установлен ключ noclobber option.
|| логическая операция OR (логическое ИЛИ). В опрециях проверки условий, оператор || возвращает 0 (success), если один из операндов имеет значение true (ИСТИНА).
Выполнение задачи в фоне. Команда, за которой стоит &, будет исполняться в фоновом режиме.
<strong>sleep 10 &</strong> [1] 850 [1]+  Done                    sleep 10[/crayon]
В сценариях команды, и даже циклы могут запускаться в фоновом режиме.

Пример 3-3. Запуск цикла в фоновом режиме

Команда, исполняемая в пределах сценария в фоне, может подвесить сценарий, ожидая нажатия клавиши. К счастью, это легко «лечится».
&& Логическая операция AND (логическое И). В операциях проверки условий, оператор && возвращает 0 (success) тогда, и только тогда, когда оба операнда имеют значение true (ИСТИНА).
— префикс ключа. С этого символа начинаются опциональные ключи команд.
<strong>COMMAND -[Option1][Option2][...]</strong>

<strong>ls -al</strong>

<strong>sort -dfu $filename</strong>

<strong>set -- $variable</strong>

— перенаправление из/в stdin или stdout. [дефис]

Обратите внимание, что в этом контексте «-« — не самостоятельный оператор Bash, а скорее опция, распознаваемая некоторыми утилитами UNIX (такими как tar, cat и т.п.), которые выводят результаты своей работы в stdout.

<strong>echo "whatever" | cat -</strong> whatever[/crayon]
В случае, когда ожидается имя файла, тогда «-« перенаправляет вывод на stdout (вспомните пример с <strong>tar cf</strong>) или принимает ввод с stdin.

<strong>file</strong> Usage: file [-bciknvzL] [-f namefile] [-m magicfiles] file...[/crayon]
Сама по себе команда file без параметров завершается с сообщением об ошибке.

Добавим символ «-« и получим более полезный результат. Это заставит командный интерпретатор ожидать ввода от пользователя.

<strong>file -</strong> <strong>abc</strong> standard input:              ASCII text bash$ <strong>file -</strong> <strong>#!/bin/bash</strong> standard input:              Bourne-Again shell script text executable[/crayon]
Теперь команда принимает ввод пользователя со stdin и анализирует его.

Используя передачу stdout по конвейеру другим командам, можно выполнять довольно эффектные трюки, например вставка строк в начало файла.

С помощью команды diff — находить различия между одним файлом и частью другого:

<strong>grep Linux file1 | diff file2 -</strong>

И наконец пример использования служебного символа <em>"-"</em> с командой tar.

Пример 3-4. Резервное архивирование всех файлов, которые были изменены в течение последних суток

Могут возникнуть конфликтные ситуации между опреатором перенаправления «-« и именами файлов, начинающимися с символа «-«. Поэтому сценарий должен проверять имена файлов и предаварять их префиксом пути, например, ./-FILENAME, $PWD/-FILENAME или $PATHNAME/-FILENAME.

Если значение переменной начинается с символа «-«, то это тоже может быть причиной появления ошибок.

— предыдущий рабочий каталог. [дефис] Команда cd — выполнит переход в предыдущий рабочий каталог, путь к которому хранится в переменной окружения $OLDPWD .
Не путайте оператор «-« (предыдущего рабочего каталога) с оператором «-« (переназначения). Еще раз напомню, что интерпретация символа «-« зависит от контекста, в котором он употребляется.
— Минус. Знак минус в арифметических операциях.
Символ «равно». Оператор присваивания

В зависимости от контекста применения, символ «=« может выступать в качестве оператора сравнения.

Плюс. Оператор сложения в арифметических операциях.
В зависимости от контекста применения, символ + может выступать как оператор регулярного выражения.
Ключ (опция). Дополнительный флаг для ключей (опций) команд.
Отдельные внешние и встроенные команды используют символ «+« для разрешения некоторой опции, а символ «« — для запрещения.
модуль. Модуль (остаток от деления) — арифметическая операция.
В зависимости от контекста применения, символ % может выступать в качестве шаблона.
домашний каталог. [тильда] Соответствует содержимому внутренней переменной $HOME. ~bozo — домашний каталог пользователя bozo, а команда ls ~bozo выведет содержимое его домашнего каталога. ~/ — это домашний каталог текущего пользователя, а команда ls ~/ выведет содержимое домашнего каталога текущего пользователя.

<strong>echo ~bozo</strong> /home/bozo bash$ <strong>echo ~</strong> /home/bozo bash$ <strong>echo ~/</strong> /home/bozo/ bash$ <strong>echo ~:</strong> /home/bozo: bash$ <strong>echo ~nonexistent-user</strong> ~nonexistent-user[/crayon]

~+ текущий рабочий каталог. Соответствует содержимому внутренней переменной $PWD.
~- предыдущий рабочий каталог. Соответствует содержимому внутренней переменной $OLDPWD.
^  начало-строки. В регулярных выражениях символ «^» задает начало строки текста.
Управляющий символ
 

изменяет поведение терминала или управляет выводом текста. Управляющий символ набирается с клавиатуры как комбинация CONTROL + <клавиша>.

  • <strong>Ctl-C</strong>Завершение выполнения процесса.
  • <strong>Ctl-D</strong>

    Выход из командного интерпретатора (log out) (аналог команды exit).

    «EOF» (признак конца файла). Этот символ может выступать в качестве завершающего при вводе с stdin.

  • <strong>Ctl-G</strong>«BEL» (звуковой сигнал — «звонок»).
  • <strong>Ctl-H</strong>Backspace — удаление предыдущего символа.

  • <strong>Ctl-J</strong>Возврат каретки.
  • <strong>Ctl-L</strong>Перевод формата (очистка экрана (окна) терминала). Аналогична команде clear.
  • <strong>Ctl-M</strong>Перевод строки.
  • <strong>Ctl-U</strong>Стирание строки ввода.
  • <strong>Ctl-Z</strong>Приостановка процесса.
Пробельный символ
 

используется как разделитель команд или переменных. В качестве пробельного символа могут выступать — собственно пробел (space), символ табуляции, символ перевода строки, символ возврата каретки или комбинация из вышеперечисленных символов. В некоторых случаях, таких как присваивание значений переменным, использование пробельных символов недопустимо.

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

$IFS — переменная специального назначения. Содержит символы-разделители полей, используемые некоторыми командами. По-умолчанию — пробельные символы.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

пять + шесть =