- •«Работа в ос 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используются операторы управления, немного напоминающие операторы языкаC. Простейшая форма управления выполнением, связанная с использованием операций&&и||, была описана выше. Как было сказано, в роли логического условия, определяющего ход дальнейшего выполнения, выступает код завершения предыдущей команды или списка команд, при этом «истинной» считается команда, завершившаяся с кодом 0.
Для получения более богатого набора проверяемых условий в ранних версиях UNIXтрадиционно используется встроенная командаtest строка, где строка задает проверяемое условие, которое определяет код возврата командыtest. Вbashможно, кроме того, использовать более приятный синтаксис:[ строка ], где использование квадратных скобок означает как бы неявный вызов командыtest. Пробелы, отделяющие квадратные скобки от строки условия, в данном случае обязательны.
В следующей таблице описаны синтаксис и семантика строк, задающих логические выражения.
Запись |
Проверяемое условие |
Условия, связанные с файлами | |
-b файл |
Файл существует и является блочным специальным |
-c файл |
Файл существует и является символьным специальным |
-d файл |
Файл существует и является каталогом |
-e файл |
Файл существует |
-f файл |
Файл существует и является обычным файлом |
-h файл |
Файл существует и является символической связью |
-r файл |
Файл существует и доступен текущему пользователю для чтения |
-s файл |
Файл существует и имеет ненулевой размер |
-t хэндл |
Хэндл открыт и соответствует терминалу |
-w файл |
Файл существует и доступен текущему пользователю для записи |
-x файл |
Файл существует и доступен текущему пользователю для выполнения |
-O файл |
Файл существует и принадлежит текущему пользователю |
-G файл |
Файл существует и принадлежит группе текущего пользователя |
-N файл |
Файл существует и был изменен после последнего чтения |
файл1 –nt файл2 |
Файл 1 новее (т.е. был изменен позднее), чем файл 2 |
файл1 –ot файл2 |
Файл 1 старее (т.е. был изменен раньше), чем файл 2 |
файл1 –ef файл2 |
Оба имени ссылаются на один и тот же файл (как жесткие ссылки) |
Условия, связанные со строками | |
-z строка |
Строка пуста (имеет нулевую длину) |
-n строка |
Строка непустая |
строка |
Строка непустая |
строка1 = строка2 |
Строки равны |
строка1 == строка2 |
Строки равны |
строка1 != строка2 |
Строки не равны |
строка1 < строка2 |
Строка 1 меньше (в словарном смысле), чем строка 2 |
строка1 > строка2 |
Строка 1 больше (в словарном смысле), чем строка 2 |
Условия, связанные с числами | |
число1 ОП число2 |
Операция сравнения ОПможет быть любой из следующих: -eq(равно), -ne(не равно), -lt(меньше), -le(меньше либо равно), -gt(больше), -ge(больше либо равно). |
Логические связки | |
! выражение |
Инверсия (логическое отрицание) |
выраж1 -a выраж2 |
Конъюнкция (логическое И) |
выраж1 -o выраж2 |
Дизъюнкция (логическое ИЛИ) |
В приведенной таблице строка,файл,число– это строковые выражения (возможно, содержащие переменные, специальные параметры, разного вида кавычки и т.п.). При этом строкафайлрассматривается как имя файла, а строкачислодолжна представлять собой запись целого числа, возможно, со знаком.
При вычислении логических выражений более высокий приоритет имеют первичные операции (связанные с файлами, строками и числами), затем инверсия, конъюнкция и дизъюнкция. Для изменения порядка операций можно использовать круглые скобки.
Еще один способ построения сложных условий связан с использованием списков команд. Напомним, что любая команда, помимо своей основной работы, вырабатывает код завершения – нулевой («истина») или ненулевой («ложь»). Команда test(или[…]) ничего другого и не делает. Имеются, кроме того, специальные встроенные командыtrueиfalse, которые могут использоваться как логические константы. Таким образом, список команд, разделенных связками!(отрицание),&&(конъюнкция) и||(дизъюнкция), является своеобразным логическим выражением, значение которого может быть использовано в описанных ниже операторах управления. Рассмотрим, например, следующий список команд:
[ -x my_prog ] && my_prog && [ $a –ge 4 ]
Этот список будет «истинным» (т.е. выдаст нулевой код завершения), только если в текущем каталоге существует выполнимый файл (программа или скрипт) my_prog, вызов этой программы завершается с нулевым кодом, а значением переменнойaявляется строка, представляющая целое число не менее 4. Если же файлmy_progне существует или недоступен для выполнения, то не будет делаться безнадежной попытки запустить его на выполнение и не будет проверяться значение переменнойa, а результатом выполнения всего списка будет «ложь».
Использование условий, выражаемых кодами завершения команд, дает возможность применить описанные ниже управляющие операторы языка shell, которые формально являются встроенными командамиshell, однако отличаются особым синтаксисом и специальным назначением. Следует отметить, что кодом завершения каждого из описанных ниже операторов будет либо код завершения последней выполненной команды, либо 0, если ни одна команда не была выполнена.