- •1_1. Ввод-вывод
- •1_2. Синхронное и асинхронное выполнение команд
- •1_3. Конвейер
- •1_4. Метасимволы, генерация имен файлов
- •2_1. Комментарии
- •2_2. Подстановка результатов выполнения команд
- •2_3. Переменные и подстановка их значений
- •2_4. Специальные переменные
- •3_1. Цикл для
- •3_2. Оператор выбора
- •3_3. Условный оператор.
- •3_4. Цикл пока
- •3_5. Функции
- •3_6. Зарезервированные слова
- •3_7. Специальные команды
- •4_1. Запуск shellа
- •4_2. Выполнение
- •4_3. Окружение
- •4_4. Сигналы
- •4_5. Замечания
- •5_1. Команда test
- •5_2. Команда expr
- •5_3. Команда ena
4_5. Замечания
При выполненнии команд запоминается их местонахождение.
Поэтому при создании команды с тем же именем, но находящейся в
другой директории, все равно будет выполняться старая команда
(если вызов происходит по короткому имени). Для исправления си-
туации воспользуйтесь командой hash с ключом -r (см. Специаль-
ные команды).
Если вы переименовали текущую или вышележащую директорию,
то команда pwd может давать неверную информацию. Для исправле-
ния ситуации воспользуйтесь командой cd с полным именем дирек-
тории.
* 5_ Дополнительные сведения *
5_1. Команда test
Команда test применяется для проверки условия. Формат вы-
зова:
test <выражение>
или
[ <выражение> ]
Команда test вычисляет <выражение> и, если его значение - исти-
на, возвращает код завершения 0 (true); иначе - ненулевое зна-
чение (false). Ненулевой код завершения возвращается и если
опущены аргументы. <Выражение> может состоять из следующих при-
митивов:
-r файл - истина, если файл существует и доступен для
чтения
-w файл - истина, если файл существует и доступен для
записи
-x файл - истина, если файл существует и является вы-
полняемым
-f файл - истина, если файл существует и является обыч-
ным файлом
-d файл - истина, если файл существует и является ди-
ректорией
-c файл - истина, если файл существует и является спе-
циальным символьно-ориентированным файлом
-b файл - истина, если файл существует и является спе-
циальным блок-ориентированным файлом
-p файл - истина, если файл существует и является име-
нованным каналом (pipe)
-s файл - истина, если файл существует и имеет ненуле-
вую длину
-t [ дескриптор файла ]
- истина, если открытый файл с указанным деск-
риптором (по умолчанию 1) существует и ассоции-
рован с терминалом
-zho s1 - истина, если длина строки s1 нулевая
-n s1 - истина, если длина строки s1 ненулевая
s1 = s2 - истина, если строки s1 и s2 совпадают
s1 != s2 - истина, если строки s1 и s2 не совпадают
s1 - истина, если s1 непустая строка
n1 -eq n2 - истина, если целые n1 и n2 алгебраически сов-
падают . На месте -eq могут быть также -ne,
-gt, -ge, -lt, -le
5_2. Команда expr
Команда expr применяется для вычисления выражений. Резуль-
тат выводится на стандартный вывод. Операнды выражения должны
быть разделены пробелами. Метасимволы должны быть экранированы.
Надо заметить, что 0 возвращается в качестве числа, а не для
индикации пустой строки. Строки, содержащие пробелы или другие
специальные символы, должны быть заключены в кавычки. Целые
рассматриваются как 32-битные числа.
Ниже приведен список операторов в порядке возврастания
приоритета, операции с равным приоритетом заключены в фигурные
скобки. Перед символами, которые должны быть экранированы, сто-
ит \.
<выр> \| <выр>
если первое <выр> не пустое и не нулевое, то
возвращает его, иначе возвращает второе <выр>
<выр> \& <выр>
если оба <выр> не пустые и не нулевые, то
возвращает первое <выр>, иначе возвращает 0
<выр> { =, \>, \>=, \<, \<=, != } <выр>
возвращает результат целочисленного сравнения
если оба <выр> - целые; иначе возвращает ре-
зультат лексического сравнения
<выр> { +, - } <выр>
сложение и вычитание целочисленных аргументов
<выр> { \*, /, % } <выр>
умножение, деление и получение остатка от деле-
ния целочисленных аргументов
<выр> : <выр>
оператор сопоставления : сопоставляет первый
аргумент со вторым, который должен быть регу-
лярным выражением. Обычно оператор сравнения
возвращает число символов, удовлетворяющих об-
разцу (0 при неудачном сравнении). Однако сим-
волы \( и \) могут применяться для выделения
части первого аргумента.
Регулярное выражение строится следующим образом:
. - обозначает любой символ
* - обозначает предыдущий символ, повторенный несколько
раз
[] - обозначают любой один из указанных между ними симво-
лов; группа символов может обозначаться с помощью
знака "-" (т.е. [0-9] эквивалентно [0123456789]); ес-
ли после [ стоит ^, то это эквивалентно любому симво-
лу, кроме указанных в скобках и <возврата_каретки>;
для указания ] в качестве образца, надо поставить ее
сразу за [ (т.е. []...]); . и * внутри квадратных
скобок обозначают самих себя
Все остальные символы (и ^, если стоит не в квадратных скобках)
обозначают самих себя. Для указания символов ., *,[ и ] надо
экранировать их (т.е. писать \., \*, \[, \]).
Примеры.
1. a=`expr $a + 1`
- увеличение на 1 переменной a
2. expr $a : '.*/\(.*\)' \| $a
- выделяет из имени файла короткое имя (т.е. из
/usr/util/ena выделяется ena). Внимание,
одиночный символ / будет воспринят как знак
операции деления.
3. expr $VAR : '.*'
- получение количества символов переменной VAR.
В качестве побочного эффекта expr возвращает следующие коды за-
вершения:
0 - если выражение не нуль и не пустая строка
1 - если выражение нуль или пустая строка
2 - для некорректных выражений
Команда expr также выдает следующие сообщения об ошибках:
syntax error - для ошибок в операторах или операндах
non-numeric argument - для попыток применения арифметических
операций к нечисловым строкам
Замечание.
Допустим, что мы хотим сравнить значение переменной a с
каким-либо символом, имеющим для expr особый смысл, например,
со знаком равенства. Пусть $a на самом деле является знаком ра-
венства. Так как аргументы предварительно обрабатываются shel-
lом, то команда
expr $a = '='
будет воспринята как
expr = = =
что синтаксически некорректно. В подобных случаях надо пользо-
ваться таким приемом:
expr X$a = X=
т.е. добавлением некоторого символа к обеим строкам, что никак
не влияет на результат сравнения, однако позволяет избежать
синтаксической ошибки.