Шрифт:
Заключительное замечание
В этой главе мы узнали множество маленьких хитростей, которые могут пригодиться в практической работе. С ростом опыта в создании сценариев умение эффективно работать со строками и числами обретает истинную ценность. Наш сценарий loan-calc показал, что даже простые сценарии могут производить некоторые действительно полезные вычисления.
Дополнительные сведения
Даже при том, что сценарий loan-calc работает, он далек от совершенства. В качестве самостоятельного упражнения попробуйте улучшить сценарий loan-calc, добавив в него следующие возможности:
• полную проверку аргументов командной строки;
• параметр командной строки, реализующий «интерактивный» режим, в котором сценарий будет запрашивать ввод суммы, процента и срока кредита;
• улучшенный формат вывода.
35. Массивы
В предыдущей главе мы научились работать в командной оболочке со строками и числами. Типы данных, которые мы рассматривали до сих пор, в компьютерных кругах известны как скалярные переменные, то есть переменные, способные хранить единственное значение.
В этой главе мы познакомимся еще с одной структурой данных, которая называется массивом, способной хранить множество значений. Массивы поддерживаются практически во всех языках программирования. Командная оболочка также поддерживает их, хотя и в несколько ограниченном виде. Но даже в этом случае они могут использоваться для решения многих задач программирования.
Что такое массивы?
Массивы — это переменные, хранящие более одного значения. Массивы организованы подобно таблице. Возьмем, к примеру, электронную таблицу. Электронная таблица действует подобно двумерному массиву. В ней есть строки и столбцы, и каждая отдельная ячейка имеет свой адрес, определяемый номером строки и номером столбца. Массив устроен аналогично. Массив состоит из ячеек, которые называют элементами, и каждый элемент содержит данные. Доступ к отдельному элементу осуществляется с использованием его адреса, который называется индексом.
Большинство языков программирования поддерживает многомерные массивы. Электронная таблица — это пример многомерного массива с двумя измерениями: ширина и высота. Многие языки поддерживают массивы с произвольным числом измерений, однако на практике чаще всего, пожалуй, используются двух- и трехмерные массивы.
Массивы в bash ограничены единственным измерением. Их можно рассматривать как электронные таблицы с единственным столбцом. Но даже с этим ограничением массивам можно найти массу применений. Впервые поддержка массивов появилась в bash версии 2. Оригинальная командная оболочка Unix sh вообще не поддерживала их.
Создание массива
Переменным-массивам можно давать такие же имена, что и другим переменным bash, и они точно так же создаются автоматически при первом обращении к ним. Например:
[me@linuxbox ~]$ a[1]=foo
[me@linuxbox ~]$ echo ${a[1]}
foo
Это пример присваивания значения элементу массива и обращения к нему. Первая команда присваивает значение foo элементу массива a с индексом 1. Вторая команда выводит значение, хранящееся в элементе с индексом 1. Использование фигурных скобок во второй команде является обязательным условием, иначе командная оболочка будет пытаться выполнить подстановку пути, опираясь на имя элемента массива.
Массив можно также создать командой declare:
[me@linuxbox ~]$ declare -a a
Параметр -a в этом примере требует от declare создать массив (array) с именем a.
Присваивание значений массиву
Значения элементам массивов можно присваивать одним из двух способов. Присваивание одиночных значений осуществляется с использованием следующего синтаксиса:
имя[индекс]=значение
где имя — это имя массива, индекс — целое число (или арифметическое выражение) больше или равное 0. Обратите внимание, что первый элемент массива имеет индекс 0, а не 1. значение — строка или целое число, присваиваемое элементу массива.
Присвоить сразу множество значений можно с использованием следующего синтаксиса:
имя=(значение1значение2 ...)
где имя — это имя массива, а значение1 значение1 ... — значения, присваиваемые последовательным элементам массива, начиная с элемента с индексом 0. Например, если понадобится присвоить элементам массива days сокращенные названия дней недели, это можно сделать так:
[me@linuxbox ~]$ days=(Sun Mon Tue Wed Thu Fri Sat)
Можно присваивать значения конкретным элементам, указывая индекс для каждого значения:
[me@linuxbox ~]$ days=([0]=Sun [1]=Mon [2]=Tue [3]=Wed [4]=Thu [5]=Fri [6]=Sat)
Доступ к элементам массива
Итак, где могут пригодиться массивы? Так же как многие задачи управления данными могут решаться с применением программ электронных таблиц, массивы могут применяться для решения множества задач программирования.