Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОС лабы / ОС - Лабораторная работа 3.doc
Скачиваний:
60
Добавлен:
01.06.2015
Размер:
469.5 Кб
Скачать
      1. Специальные символы и подстановка значений

Некоторые символы алфавита имеют специальный смысл в языке shell.

Отметим, прежде всего, что знак \(символ экранирования) позволяет лишить специального значения любой следующий за ним символ.

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

Знаки *,?и[…]используются при задании шаблонов строк, чаще всего при групповом задании имен файлов в командной строке.

Знак *соответствует любому количеству любых символов в имени файла. Например, шаблонуA*B*Cсоответствуют такие имена, какA1B2C,ABCDEFGH.C,ABC. Шаблон, состоящий из одного знака*, означает, таким образом, «все имена файлов данного каталога». Исключение составляют только имена файлов, начинающиеся с точки.

Знак ?соответствует ровно одному любому символу в имени файла. Например, шаблонуA?B?Cсоответствуют именаA1B2C,AAB.C, но неABCи неAAABBBCCC.

Квадратные скобки позволяют явно перечислить ожидаемые символы. Для указания диапазона символов можно указать начальный и конечный символы, разделив их знаком . Например, шаблону[A-Da-dX]*соответствуют все имена файлов, начинающиеся с прописных или строчных буквA,B,C,Dили с прописнойX.

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

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

Можно использовать также строку в двойных кавычках: "строка". Существенное отличие такой записи заключается в том, что внутри двойных кавычек сохраняют специальный смысл символы\,$и`(обратный апостроф), а внутри апострофов они рассматриваются как обычные символы.

Весьма своеобразный смысл имеют обратные апострофы. Строка, записанная внутри них, рассматривается как команда: `команда`. Эта команда выполняется, и данные ее стандартного вывода подставляются взамен строки в обратных апострофах. Более новой формой записи той же конструкции является такая:$(команда). Смысл тот же, что при использовании обратных апострофов.

Символ $в разных контекстах означает подстановку значения некоторой переменной или иной конструкции. Он будет подробно рассмотрен ниже.

Символ ~означает полное имя «домашнего» каталога текущего пользователя. Это имя хранится также в переменнойHOME.

      1. Переменные

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

имя_переменной=[значение]

Курсивные квадратные скобки []здесь и далее означают необязательную часть языковой конструкции.

Имя должно начинаться с буквы (латинской) или с подчеркивания. Прописные и строчные буквы различаются. Значением переменной может быть любая строка, в том числе пустая. Перед выполнением присваивания выполняются подстановки, описанные в предыдущем параграфе. Если значение не задано, то присваивается пустая строка.

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

Запись

Смысл

a=XYZ

a  "XYZ"

b=a

b  "a"

c=$a

c  "XYZ"

d=pq${c}rs

d"pqXYZrs"

Текущее количество символов значения переменной (длину строки) можно получить с помощью выражения ${#имя_переменной}.

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

При запуске любой программы или скрипта ей передается набор переменных среды, который включает в себя системные переменные и те пользовательские переменные, которые были объявлены экспортируемыми (с помощью встроенной командыexport). Однако никакие изменения переменных, сделанные в ходе выполнения скрипта, не сохранятся после его завершения. Некоторые из системных переменных приведены ниже.

Переменная

Смысл

PWD

Полное имя текущего каталога

UID

Идентификатор пользователя

GROUPS

Список групп, членом которых является текущий пользователь

BASH

(или SHELL)

Полное имя файла, из которого загружен текущий шелл

RANDOM

Случайное число в интервале от 0 до 32767

HOSTNAME

Сетевое имя компьютера

OSTYPE

Выполняемая операционная система

IFS

Набор символов-разделителей. По умолчанию включает пробел, табуляцию и перевод строки.

PATH

Список каталогов, в которых шелл ищет команды.

HOME

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

PS1

Первичное приглашение к вводу команды.

PS2

Вторичное приглашение к продолжению ввода команды.

PS3

«Третичное» приглашение, используемое некоторыми встроенными командами.

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

В некоторых шеллах (в том числе bash) можно использовать переменные-массивы (одномерные). Для создания массива достаточно записать присваивание в форме:

имя_переменной[индекс]=значение

Индексы массива отсчитываются от 0.

Можно использовать также групповое присваивание всем или части элементов массива:

имя_переменной=(значение1 значение2 … значениеN)

Каждое значение в списке должно задаваться одним словом или должно быть заключено в кавычки. Перед любым значением можно указать индекс элемента, которому оно должно быть присвоено: [индекс]=значение. После этого следующие по списку значения, для которых не указан индекс, будут присваиваться следующим по порядку элементам массива.

Для доступа к конкретному элементу массива используется форма записи ${имя_массива[индекс]}. Запись${имя_массива[*]}выдает значения всех элементов массива, разделенные пробелами. Число элементов массива записывается как${#имя_массива[*]}.

Помимо переменных, можно использовать значения специальных параметров, которые доступны только для чтения. Их запись всегда начинается с символа $. Некоторые из параметров описаны ниже.

Параметр

Смысл

$1 … $9

Один из первых 9 параметров командной строки вызова скрипта

$0

Имя выполняемого скрипта

$*

Строка, составленная из всех параметров командной строки вызова скрипта, разделенных пробелами

$@

Набор всех параметров командной строки вызова скрипта в виде отдельных слов, т.е. в виде "$1" "$2" "$3"

$#

Количество параметров командной строки

$!

Идентификатор последнего запущенного фонового процесса (см. п.2.4.3)

$?

Код завершения последней завершившейся команды (или конвейера), выполнявшейся как процесс переднего плана (см. п.2.4.3)

Если специальные параметры используются вне текста скрипта, при интерактивной работе с шеллом, то их значения $0…$9,$*,$@,$#описывают текущий шелл: имя его файла, набор параметров, с которыми был запущен шелл, количество этих параметров.