- •«Работа в ос unix/Linux и программирование на языке shell»
- •Интерпретатор команд (shell)
- •Структура команд unix
- •Простые команды
- •Стандартные ввод и вывод
- •Параметры
- •Составные команды
- •Специальные символы и подстановка значений
- •Переменные
- •Логические выражения и операторы управления
- •Оператор if:
- •Оператор while:
- •Оператор until:
- •Оператор case:
- •Оператор for:
- •Альтернативная форма оператора for:
- •Оператор select:
- •Оператор break:
- •Оператор continue:
- •Оператор shift:
- •Арифметические выражения
- •Работа пользователя в системе unix
- •Начало и завершение работы в системе
- •Запуск и выполнение команд
- •Фоновые процессы и управление заданиями
- •Скрипты
- •Некоторые команды
- •Справочные команды
- •Man [том]имя_команды
- •Info имя_команды
- •Help имя_встроенной_команды
- •Информационные команды
- •Ls [ключи] параметры
- •History [-c] [число]
- •Hostname [ключи]
- •Ps [ключи]
- •Uname [ключи]
- •Date [ключи] [новая_дата]
- •Cal [ключи] [месяц [год]]
- •Du [ключи] [список_имен]
- •Stat [список_имен]
- •Mv файл1 файл2илиmvсписок_файловкаталог
- •Find список_каталогов [ключи]
- •Rmdir [ключи] список_каталогов
- •Cat список_файлов
- •Команды для работы с данными
- •Echo [ключи] параметры
- •More [файл]
- •Sort [ключи] [-k от_поля [, до_поля]] [список_файлов]
- •Cut [ключи] [файлы]
- •Команды управления процессами
- •Testсписок_аргументов
- •Read [ключи] [список_переменных]
- •Getopts строка_ключей переменная [список_слов]
- •Примеры команд и скриптов
- •Примеры команд интерактивного режима
- •Создание текстового файла
- •Работа с файлами
- •Определить трех пользователей системы, чьи домашние каталоги с содержащимися в них файлами занимают больше всего дискового пространства
- •Примеры скриптов
- •Выдать имена всех файлов каталога-параметра и всех его подкаталогов, отступами показывая вложенность каталогов. Если параметр не задан, начать с текущего каталога.
- •Порядок выполнения работы
- •Примеры заданий на использование команд в интерактивном режиме
- •Список вариантов заданий на разработку командных файлов
- •Контрольные вопросы
Специальные символы и подстановка значений
Некоторые символы алфавита имеют специальный смысл в языке 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.
Переменные
Как при интерактивной работе, так и при написании скриптов пользователь может определять и использовать переменные. Переменная считается определенной с момента первого присваивания ей значения:
имя_переменной=[значение]
Курсивные квадратные скобки […]здесь и далее означают необязательную часть языковой конструкции.
Имя должно начинаться с буквы (латинской) или с подчеркивания. Прописные и строчные буквы различаются. Значением переменной может быть любая строка, в том числе пустая. Перед выполнением присваивания выполняются подстановки, описанные в предыдущем параграфе. Если значение не задано, то присваивается пустая строка.
Чтобы использовать значение переменной, перед ее именем следует указать знак $. Ниже показаны примеры выполнения присваиваний. В последнем примере использование фигурных скобок позволяет отделить имя переменной от следующих за ним букв.
Запись |
Смысл |
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,$*,$@,$#описывают текущий шелл: имя его файла, набор параметров, с которыми был запущен шелл, количество этих параметров.