|
В настоящее время актуальный стандарт - это POSIX 2008 и его дополнение POSIX 1003.13 |
Язык shell
В управляющих конструкциях if и while часто используется команда test, она проверяет некоторое условие и вырабатывает нулевой или ненулевой код завершения в зависимости от того, оказалось ли условие, соответственно, истинным или ложным. Команда записывается любым из двух способов:
test условие
или употребив пару квадратных скобок:
[ условие ]
Условие может включать, помимо прочих, следующие примитивы:
-r файл
Истина, если файл существует и доступен для чтения.
-w файл
Истина, если файл существует и доступен для записи.
-x файл
Истина, если файл существует и является выполнимым.
-f файл
Истина, если файл существует и является обычным файлом.
-d файл
Истина, если файл существует и является каталогом.
-c файл
Истина, если файл существует и является специальным символьным файлом.
-b файл
Истина, если файл существует и является специальным блочным файлом.
-p файл
Истина, если файл существует и является именованным каналом.
-s файл
Истина, если файл существует и имеет ненулевой размер.
-n s1
Истина, если цепочка символов s1 имеет ненулевую длину.
s1 = s2
Истина, если цепочки символов s1 и s2 равны.
s1 != s2
Истина, если цепочки символов s1 и s2 не равны.
n1 -eq n2
Истина, если целые числа n1 и n2 алгебраически равны. На месте -eq могут быть также операции сравнения -ne (не равно), -gt (больше), -ge (больше или равно), -lt (меньше), -le (меньше или равно).
Примитивы комбинируются с помощью круглых скобок, а также следующих операций (в порядке уменьшения приоритета):
Обратим внимание на то, что квадратные скобки, обрамляющие условие, и каждый компонент условия должны быть выделены пробелами.
Приведем пример использования управляющей конструкции if. В процессе загрузки практически любой разновидности ОС Unix выполняются строки следующего или близкого вида (см. листинг 2.19):
if [ -s ${f} ]
then
/bin/sh ${f} start
fi
Листинг
2.19.
Пример условного оператора.
Если файл, имя которого является значением переменной f, существует и имеет ненулевой размер, он выполняется с аргументом start.
В качестве примера употребления конструкции case приведем еще один фрагмент, типичный для процесса загрузки системы (см. листинг 2.20):
case "$1" in
start)
start
;;
stop)
stop
;;
reload | restart)
restart
;;
condrestart)
if [ -f /var/lock/subsys/atd ]
then
restart
fi
;;
*)
echo $"Usage: $0 {start | stop | restart | condrestart}"
exit 1
esac
Листинг
2.20.
Пример оператора выбора.
Известные значения первого аргумента распознаются, в ответ на все прочие (шаблон *) сообщается, как пользоваться данной shell-процедурой.
Следующий пример иллюстрирует определение и вызов функции (см. листинг 2.21).
echo $# $1
f ( ) {
echo $# $1
}
f a b
f b
echo $# $1
Листинг
2.21.
Пример определения и вызова функции.
Если данный текст хранится в файле g, то по окончании выполнения команды (вызов shell-процедуры, содержащей функцию)
g c d e
будет выдан следующий результат:
3 c 2 a 1 b 3 c