• 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, которые мы рассмотрим чуть ниже.
5.8.3 Оператор
Формат оператора case таков:
case word in [[(] pattern [| pattern]…) list;;]… esac
Команда case вначале производит раскрытие слова word, и пытается сопоставить результат с каждым из образцов pattern поочередно. После нахождения первого совпадения дальнейшие проверки не производятся, выполняется список команд, стоящий после того образца, с которым обнаружено совпадение. Значение, возвращаемое оператором, равно 0, если совпадений с образцами не обнаружено. В противном случае возвращается значение, выдаваемое последней командой из соответствующего списка.
Следующий пример использования оператора case заимствован из системного скрипта /etc/rc.d/rc.sysinit.
case '$UTC' in
yes|true)
CLOCKFLAGS='$CLOCKFLAGS -u';
CLOCKDEF='$CLOCKDEF (utc)';
;;
no|false)
CLOCKFLAGS='$CLOCKFLAGS -localtime';
CLOCKDEF='$CLOCKDEF (localtime)';
;;
esac
Если переменная принимает значение yes или true, то будет выполнена первая пара команд, а если ее значение равно no или false - вторая пара.
5.8.4 Оператор
Оператор select позволяет организовать интерактивное взаимодействие с пользователем. Он имеет следующий формат:
select name [in word;] do list; done
Вначале из шаблона word формируется список слов, соответствующих шаблону. Этот набор слов выводится в стандартный поток ошибок, причем каждое слово сопровождается порядковым номером. Если шаблон word пропущен, таким же образом выводятся позиционные параметры. После этого выдается стандартное приглашение PS3, и оболочка ожидает ввода строки на стандартном вводе. Если введенная строка содержит число, соответствующее одному из отображенных слов, то переменной name присваивается значение, равное этому слову. Если введена пустая строка, то номера и соответствующие слова выводятся заново. Если введено любое другое значение, переменной name присваивается нулевое значение. Введенная пользователем строка запоминается в переменой REPLY. Список команд list выполняется с выбранным значением переменной name.
Вот небольшой скрипт:
#!/bin/sh
echo 'Какую ОС Вы предпочитаете?'
select var in 'Linux' 'Gnu Hurd' 'Free BSD' 'Other'; do
break
done
echo 'Вы бы выбрали $var'
Если сохранить этот текст в файле, сделать файл исполняемым и запустить, на экран будет выдан следующий запрос:
Какую ОС Вы предпочитаете?
1) Linux
2) Gnu Hurd
3) Free BSD
4) Other
#?
Нажмите любую из 4 предложенных цифр (1,2,3,4). Если вы, например, введете 1, то увидите собщение:
“Вы бы выбрали Linux”