Linux: Полное руководство
Шрифт:
Второе выражение нужно использовать, если значение хотя бы одного элемента массива может содержать пробелы.
Можно инициализировать массив целиком: команда
эквивалентна списку
Эти способы инициализации массивов могут применяться как в bash, так и в ksh и в других командных оболочках. А следующий способ работает только в bash:
8.4. Управляющие
Напоминаю (п.3.4.7), что список команд — это одиночная команда, конвейер или последовательность команд/конвейеров, разделенных одним из операторов: ; && ||, завершенная точкой с запятой. Не забывайте ставить точку с запятой даже после одиночной команды, терять ее — типичная ошибка начинающих программистов.
В синтаксис следующих команд квадратные скобки не входят: они ограничивают необязательные выражения.
8.4.1. Условные операторы
Оператор варианта case
Синтаксис:
Ищется первый шаблон, совпадающий со значением. Если он найден, то выполняется соответствующий ему список команд, завершенный двумя символами «;». Шаблон и список разделяются символом «)». Одному списку команд может соответствовать несколько шаблонов, тогда они разделяются символом «|».
В шаблонах могут использоваться метасимволы *, ? и [] (о подстановке метасимволов сказано в п.3.4.5). С их помощью можно организовать инструкцию, действующую как default в операторе switch языка С.
Порядок сравнения шаблонов со значением не определен. Первое совпадение прекращает дальнейшее сравнение и приводит к выполнению соответствующего списка команд и выходу из структуры case — поведение, больше похожее на поведение оператора case в языке Паскаль, чем на switch в языке С.
Листинг 8.1. Пример использования оператора case
Обратите внимание на апострофы вместо кавычек во втором списке: они экранируют подстроку «!!» от подстановки предыдущей команды.
Синтаксис:
Эта конструкция работает так же, как в других языках программирования. Сначала выполняются команды из
Можно использовать сокращенный вариант, только if-then-fi:
– ne 0 ]; then echo "Ошибка. Смотри протокол"; fi;
В вышеприведенной команде вместо анализа кода завершения списка использована проверка условия. Две формы такой проверки эквивалентны: встроенная команда test и [условие]. Например, для проверки существования
файла можно написатьили
Если вместо слова test используются квадратные скобки, они обязательно должны быть отделены от аргументов пробелом, потому что на самом деле «[» — это название команды, а «]» — обязательный последний аргумент этой команды.
В случае истинности условия команда test возвращает код успешного завершения, то есть 0; в случае ложности — код ошибки 1 (не спутайте с обычными языками программирования, где 1 — другое имя для true!).
Команда test может проверять и строку на пустоту: непустая строка считается выполнением условия и приводит к коду завершения 0. Пример:
Условные выражения можно комбинировать с помощью обычных логических операций:
♦
♦
♦
Элементарные условные выражения перечислены в таблицах 8.2 и 8.3. Полный список их можно получить по команде
Основные условные выражения для файлов Таблица 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 в лексикографическом порядке |