В шаблонах могут использоваться метасимволы *, ? и [] (о подстановке метасимволов сказано в п.3.4.5). С их помощью можно организовать инструкцию, действующую как defaultв операторе switchязыка С.
Порядок сравнения шаблонов со значением не определен. Первое совпадение прекращает дальнейшее сравнение и приводит к выполнению соответствующего списка команд и выходу из структуры case— поведение, больше похожее на поведение оператора case в языке Паскаль, чем на switchв языке С.
Листинг 8.1. Пример использования оператора case
echo "Ошибка. Кому переслать протокол?"
echo "Начальнику: b"
echo "Коллегам: с"
echo "Сам разберусь: any key"
read answer
case $answer in
b|B) mail -s "error log" boss < error.log;;
c|C) mail -s 'Help!!! error log' -c ivan den < error.log;;
*) echo "OK. Exiting";
exit;;
esac
Обратите внимание на апострофы вместо кавычек во втором списке: они экранируют подстроку «!!» от подстановки предыдущей команды.
Условный оператор if
Синтаксис:
if список1 then
список2
[elif список3 then
список4]
[else
список5]
fi
Эта конструкция работает так же, как в других языках программирования. Сначала выполняются команды из списка1
. Если этот список выполнен успешно, то есть с кодом завершения 0, то выполняется список2
, если нет — то список, стоящий после очередного elif. При невозможности выполнить список команд, стоящий после очередного then, выполняется список, стоящий после else.
Можно использовать сокращенный вариант, только if-then-fi:
$ if [ $? -ne 0 ]; then echo "Ошибка. Смотри протокол"; fi;
Оператор test и условные выражения
В вышеприведенной команде вместо анализа кода завершения списка использована проверка условия. Две формы такой проверки эквивалентны: встроенная команда testи [условие]. Например, для проверки существования файла можно написать
test -e <���файл>
или
[ -е <���файл> ]
Если вместо слова testиспользуются квадратные скобки, они обязательно должны быть отделены от аргументов пробелом, потому что на самом деле «[» — это название команды, а «]» — обязательный последний аргумент этой команды.
В случае истинности условия команда testвозвращает код успешного завершения, то есть 0; в случае ложности — код ошибки 1 (не спутайте с обычными языками программирования, где 1 — другое имя для true!).
Команда testможет проверять и строку на пустоту: непустая строка считается выполнением условия и приводит к коду завершения 0. Пример:
$ test $USER; echo $?
0
$ test $VAR_not_set_yet; echo $?
1
Условные выражения можно комбинировать с помощью обычных логических операций:
♦ !(выражение)
— отрицание;
♦ выражение1 -а выражение2
— логическое И ( and );
♦ выражение1 -о выражение2
— логическое ИЛИ ( or ).
Элементарные условные выражения перечислены в таблицах 8.2 и 8.3. Полный список их можно получить по команде help test
.
Основные условные выражения для файлов Таблица 8.2
Выражение |
Истинно, если |
-d файл |
файл существует и является каталогом |
-е файл |
файл существует |
-f файл |
файл существует и является обычным файлом |
-L файл |
файл существует и является символической ссылкой |
-r файл |
файл существует и доступен для чтения |
-w файл |
файл существует и доступен для записи |
-x файл |
файл существует и является исполняемым |
-s файл |
файл существует и его размер больше 0 |
-N файл |
файл существует и изменился со времени последнего чтения |
файл1 -nt файл2 |
время модификации файла1 позже (newer than), чем файла2 |
файл1 -ot файл2 |
время модификации файла1 раньше (older than), чем файла2 |
файл1 -ef файл2 |
файл1 — это жесткая ссылка на файл2 |
Элементарные условные выражение для сравнения строк Таблица 8.3
Выражение |
Истинно, если |
-z строка |
длина строки равна 0 |
-n строка |
длина строки не равна 0 |
стр1 == стр2 |
строки совпадают |
стр1 !== стр2 |
строки не совпадают |
стр1 < стр2 |
строка1 предшествует строке2 в лексикографическом порядке. Алфавит соответствует текущей локали |
стр1 > стр2 |
строка1 следует за строкой2 в лексикографическом порядке |
Арифметическое условное выражение имеет формат arg1 OP arg2
, где arg1
и arg2
— целые числа, a OP
— одна из операций:
Читать дальше
Конец ознакомительного отрывка
Купить книгу