Шрифт:
Интервал:
Закладка:
$ echo ${weekday[0]}
Обратиться ко всем элементам массива сразу можно с помощью одного из выражений:
${имя_массива[*]} или ${имя_массива[@]}, например:
$echo ${weekday[*]}
Понедельник Пятница
Второе выражение нужно использовать, если значение хотя бы одного элемента массива может содержать пробелы.
Можно инициализировать массив целиком: команда
$ weekday=(Пн Вт Ср Чт Пт Сб Вс)
эквивалентна списку
$ weekday[0]=Пн; weekday[1] =Вт; ... weekday[6] =Вс
Эти способы инициализации массивов могут применяться как в bash, так и в ksh и в других командных оболочках. А следующий способ работает только в bash:
$ holidays= ([0]=Sunday [6]=Saturday)
8.4. Управляющие структуры
Напоминаю (п.3.4.7), что список команд — это одиночная команда, конвейер или последовательность команд/конвейеров, разделенных одним из операторов: ; && ||, завершенная точкой с запятой. Не забывайте ставить точку с запятой даже после одиночной команды, терять ее — типичная ошибка начинающих программистов.
В синтаксис следующих команд квадратные скобки не входят: они ограничивают необязательные выражения.
8.4.1. Условные операторы
Оператор варианта case
Синтаксис:
case значение in
[шаблон1) список1;;
шаблон2 | шаблон3) список2;; ]
esac
Ищется первый шаблон, совпадающий со значением. Если он найден, то выполняется соответствующий ему список команд, завершенный двумя символами «;». Шаблон и список разделяются символом «)». Одному списку команд может соответствовать несколько шаблонов, тогда они разделяются символом «|».
В шаблонах могут использоваться метасимволы *, ? и [] (о подстановке метасимволов сказано в п.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 — одна из операций:
♦ -eq — равно;
♦ -ne — не равно;
♦ -lt — меньше;
♦ -le — меньше или равно;
♦ -gt — больше;
♦ -ge — больше или равно.
Таким образом, можно переписать предыдущий пример с использованием оператора if:
Листинг 8.2. Пример использования оператора if
echo "Ошибка. Кому переслать протокол?"
echo "Начальнику: b"
echo "Коллегам: c"
echo "Сам разберусь; any key"
read answer
if [ "$answer" == "b" -o "$answer" == "B" ]; then
mail -s "error log" boss < error.log;
elif [ "$answer" == "с" -о "$answer" == "C" ]; then
mail -s 'Help!!! error log' -c ivan den < error.log;
else
echo "OK. Exiting"; exit;
fi
8.4.2. Операторы циклаКомандные интерпретаторы bash и ksh поддерживают циклы типа for, while, until и select, а интерпретатор sh — только циклы for и while.
Оператор цикла с перечислением forСинтаксис:
for переменная [in шаблон]
do
список
done
В результате подстановки шаблона получается список слов. Переменная получает значение первого слова из этого списка, и выполняется список команд, стоящий между do и done. Затем переменная получает значение очередного слова из списка слов, и снова выполняется список команд. Повторение прекращается по исчерпании слов в списке. Отсутствие конструкции [in шаблон] эквивалентно записи in [email protected].
- Операционная система UNIX - Андрей Робачевский - Программное обеспечение
- Разработка приложений в среде Linux. Второе издание - Майкл Джонсон - Программное обеспечение
- Искусство программирования для Unix - Эрик Реймонд - Программное обеспечение
- Linux - Алексей Стахнов - Программное обеспечение
- Fedora 8 Руководство пользователя - Денис Колисниченко - Программное обеспечение
- Недокументированные и малоизвестные возможности Windows XP - Роман Клименко - Программное обеспечение
- Изучаем Windows Vista. Начали! - Дмитрий Донцов - Программное обеспечение
- Windows Vista - Виталий Леонтьев - Программное обеспечение
- Архитектура операционной системы UNIX - Морис Бах - Программное обеспечение
- Windows Vista. Трюки и эффекты - Юрий Зозуля - Программное обеспечение