$ echo $(( $SECONDS/3600 ))
8.3. Массивы
Интерпретатор bash поддерживает одномерные массивы с неограниченным числом элементов. В других оболочках существуют определенные ограничения на массивы, например, в ksh максимальное число элементов массива ограничено 1024 элементами.
Нумерация элементов начинается с нуля. Тип элементов массива, как и тип параметров, строковый. Присвоить значение элементу массива можно с помощью такой конструкции:
Имя_массива[индекс] = значение, например:
$ weekday[0]=Понедельник
$ weekday[4]=Пятница
Обратиться к значению элемента массива можно следующим образом:
${имя_массива[индекс]}
Например, вывести значение первого элемента массива можно так:
$ 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 список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 и [условие].
