Приглашения оболочки Одна из очень важных переменных имеет имя PS1. Эта переменная задает вид приглашения, которое bash выводит, когда ожидает ввода очередной команды пользователем. По умолчанию этой переменной присвоено значение "\s-\v\$ ". "\s-\v\$ ". -значиние /v замените /u |
Оболочка bash
Shell как язык программирования
Как уже говорилось выше, для построения произвольных алгоритмов необходимо иметь операторы проверки условий. Оболочка bash поддерживает операторы выбора if : then : else и case, а также операторы организации циклов for, while, until, благодаря чему она превращается в мощный язык программирования.
Операторы if и test (или [ ])
Конструкция условного оператора в слегка упрощенном виде выглядит так:
if list1 then list2 else list3 fi
где list1, list2 и list3 - это последовательности команд, разделенные запятыми и оканчивающиеся точкой с запятой или символом новой строки. Кроме того, эти последовательности могут быть заключены в фигурные скобки: {list}.
Оператор if проверяет значение, возвращаемое командами из list1. Если в этом списке несколько команд, то проверяется значение, возвращаемое последней командой списка. Если это значение равно 0, то будут выполняться команды из list2 ; если это значение ненулевое, будут выполнены команды из list3. Значение, возвращаемое таким составным оператором if, совпадает со значением, выдаваемым последней командой выполняемой последовательности.
Полный формат команды if имеет вид:
if list then list [ elif list then list ] ... [ else list ] fi
(здесь квадратные скобки означают только необязательность присутствия в операторе того, что в них содержится).
В качестве выражения, которое стоит сразу после if или elif, часто используется команда test, которая может обозначаться также квадратными скобками [ ]. Команда test выполняет вычисление некоторого выражения и возвращает значение 0, если выражение истинно, и 1 в противном случае. Выражение передается программе test как аргумент. Вместо того, чтобы писать
test expression,
можно заключить выражение в квадратные скобки:
[ expression ]
Заметьте, что test и [ - это два имени одной и той же программы, а не какое-то магическое преобразование, выполняемое оболочкой bash (только синтаксис [ требует, чтобы была поставлена закрывающая скобка). Заметьте также, что вместо test в конструкции if может быть использована любая программа.
В заключение приведем пример использования оператора if:
if [ -e textmode2.htm ] ; then ls textmode* else pwd fi
Об операторе test (или [:] ) надо бы поговорить особо.
Оператор 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
Верно, если длина строки не равна нулю.
-
string1 == string2
Верно, если строки совпадают. Вместо == может использоваться =.
-
string1 !== string2
Верно, если строки не совпадают.
-
string1 < string2
Верно, если строка string1 лексикографически предшествует строке string2 (для текущей локали).
-
string1 > string2
Верно, если строка string1 лексикографически стоит после строки string2 (для текущей локали).
-
arg1 OP arg2
Здесь OP - это одна из операций арифметического сравнения: -eq (равно), -ne (не равно), -lt (меньше чем), -le (меньше или равно), -gt (больше), -ge (больше или равно). В качестве аргументов могут использоваться положительные или отрицательные целые.
Из этих элементарных условных выражений можно строить сколь угодно сложные с помощью обычных логических операций ОТРИЦАНИЯ, И и ИЛИ:
- !(expression)
-
expression1 -a expression2
Булевский оператор AND (И). Верен, если верны оба выражения.
-
expression1 -o expression2
Булевский оператор OR (ИЛИ). Верен, если верно любое из двух выражений.
Такие же условные выражения используются и в операторах while и until, которые мы рассмотрим чуть ниже.