Linux для пользователя
Шрифт:
5.7.8 Удаление специальных символов
После того, как все подстановки в командной строке сделаны, из нее еще удаляются все вхождения символов \, ` и ", которые служили для отмены специального значения других символов.
5.8. Shell как язык программирования
Как уже говорилось выше, для построения произвольных алгоритмов необходимо иметь операторы проверки
5.8.1 Операторы if и test (или [])
Конструкция условного оператора в слегка упрощенном виде выглядит так:
где list1, list2 и list3 - это последовательности команд, разделенные запятыми и оканчивающиеся точкой с запятой или символом новой строки. Кроме того, эти последовательности могут быть заключены в фигурные скобки: {list}.
Оператор if проверяет значение, возвращаемое командами из list1. Если в этом списке несколько команд, то проверяется значение, возвращаемое последней командой списка. Если это значение равно 0, то будут выполняться команды из list2; если это значение не нулевое, будут выполнены команды из list3. Значение, возвращаемой таким составным оператором if, совпадает со значением, выдаваемым последней командой выполняемой последовательности.
Полный формат команды if имеет вид:
(здесь квадратные скобки означают только необязательность присутствия в операторе того, что в них содержится).
В качестве выражения, которое стоит сразу после if или elif, часто используется команда test, которая может обозначаться также квадратными скобками []. Команда test выполняет вычисление некоторого выражения и возвращает значение 0, если выражение истинно, и 1 в противном случае. Выражение передается программе test как аргумент. Вместо того, чтобы писать
можно заключить выражение в квадратные скобки:
Заметьте, что test и [- это два имени одной и той же программы, а не какое-то магическое преобразование, выполняемое оболочкой bash (только синтаксис [требует, чтобы была поставлена закрывающая скобка). Заметьте также, что вместо test в конструкции if может быть использована любая программа.
В заключение приведем пример использования оператора if:
Об операторе test (или […]) надо бы поговорить особо.
5.8.2 Оператор test и условные выражения
Условные выражения, используемые в операторе test, строятся на основе проверки файловых атрибутов, сравнения строк и обычных арифметических сравнений. Сложные выражения строятся из следующих унарных или бинарных операций ("элементарных кирпичиков"):
• -a file
Верно, если файл с именем file существует.
• -b file
Верно, если file существует и является специальным файлом блочного устройства.
• -c file
Верно, если file существует и является специальным файлом символьного устройства.
• -d file
Верно, если file существует и является каталогом.
• -e file
Верно, если файл с именем file существует.
• -f file
Верно, если файл с именем file существует и является обычным файлом.
• -g file
Верно, если файл с именем file существует и для него установлен бит смены группы.
• -h file или -L file
Верно, если файл с именем file существует и является символической ссылкой.
• -k file
Верно, если файл с именем file существует и для него установлен "sticky'' bit.
• -p file
Верно, если файл с именем file существует и является именованным каналом (FIFO).
• -r file
Верно, если файл с именем file существует и для него установлено право на чтение
• -s file
Верно, если файл с именем file существует и его размер больше нуля.
• -t fd
Верно, если дескриптор файла fd открыт и указывает на терминал.
• -u file
Верно, если файл с именем file существует и для него установлен бит смены пользователя.
• -w file
Верно, если файл с именем file существует и для него установлено право на запись.
• -x file
Верно, если файл с именем file существует и является исполняемым.
• -O file
Верно, если файл с именем file существует и его владельцем является пользователь, на которого указывает эффективный идентификатор пользователя.
• -G file
Верно, если файл с именем file существует и принадлежит группе, определяемой эффективным идентификатором группы.
• -S file
Верно, если файл с именем file существует и является сокетом.
• -N file
Верно, если файл с именем file существует и изменялся с тех пор, как был последний раз прочитан.
• file1 -nt file2
Верно, если файл file1 имеет более позднее время модификации, чем file2.
• file1 -ot file2
Верно, если файл file1 старше, чем file2.
• file1 -ef file2
Верно, если файлы file1 и file2 имеют одинаковые номера устройств и индексных дескрипторов (inode).
• -o optname
Верно, если задействована опция оболочки optname. Пояснения см. на странице man bash.
• -z string
Верно, если длина строки равна нулю.
• -n string
Верно, если длина строки не равна нулю.