BashЯзык командного интерпретатора bash. Part 3. «Массивы».

И вот настал черёд третьего поста из цикла «Язык командного интерпретатора bash». В первых двух топиках мы в общих чертах рассмотрели понятие параметров оболочки и механизмы подстановок. В текущем топике речь пойдёт о массивах интерпретатора bash. Топик будет совсем небольшим, так как объём охватываемой им информации также невелик и легко усваивается.
Командный интерпретатор bash поддерживает одномерные массивы с неограниченным числом элементов. Да, лимит на количество элементов отсутствует, в то время, как в других оболочках существуют эти ограничения. Например, в оболочке ksh максимальным числом элементов является 1024 элемента.
Как я говорил в своём первом посте, в bash есть только один тип – строковый, а значит, все элементы массива также являются строковыми. Определяющим фактором здесь служит содержимое параметров. Нумерация элементов начинается с нуля.
Приведу пример присвоения значений элементам массива:
$ arr[0]=element1
$ arr[5]=element
$ arr[9]=elementN

Чтобы обратиться к значению элемента массива, следует также указать имя массива и в квадратных скобках порядковый номер элемента.
Например, выведем первый элемент массива, инициализированный в первом примере:
$ echo ${arr[0]}

Чтобы обратиться ко всем элементам массива сразу, нужно в качестве порядкового номера элемента массива указать символ * или символ @. Например:
$ echo ${arr[*]}
element1 element elementN

Символ @ нужно использовать, если значение хотя бы одного элемента массива может содержать пробелы.
Оболочка позволяет инициализировать массив не только последовательно указывая новый элемент в каждой строчке, но и целиком. Например:
$ arr=(1 2 3 4 5 6 7 8 9)

Данный пример будет эквивалентен списку:
$ arr[0]=1; arr[1]=2; arr[2]=3; arr[3]=4; arr[4]=5; arr[5]=6; arr[6]=7; arr[7]=8; arr[8]=9

Данные способы инициализации можно применять не только в bash, но и в других командных оболочках, таких как ksh.
А этот способ работает только в bash:
$ mass=([0]=element0 [5]=element5)

Для того, чтобы посмотреть количество элементов в массиве, необходимо выполнить команду:
$ echo ${#arr[@]}

Вывести содержимое всего массива:
$ echo ${arr[@]}

В следующем топике цикла будут рассмотрены управляющие структуры bash. Так как объём информации будет довольно велик, возможно, я разделю её на два поста.

Комментарии (10)

  • avatar
  • Dez
  • 09 июля 2009, 00:04
  • #
  • 4
Отлично все разжовано, ты все продолжаешь радовать =)
Спасибо, ждем продолжения…
Спасибо. Значит не зря работаю)
Добавки:
1) Посмотреть количество элементов массива: echo ${#arr[@]}
2) Обработать массив(в данном случае показать каждый элемент):
for ((i=0;i<${#arr[@]};i++));do echo ${arr[$i]};done
Спасибо. Первый пункт дополнил.
А на счёт второго — управляющие структуры будут расматриваться в следующем топике.
mass= ([0]=element0 [5]=element5)

пробел лишний, надо так:
mass=([0]=element0 [5]=element5)
Спасибо за статью. Продолжайте в том же духе.
Есть вопрос. Рассмотрим пример. Допустим есть массив:
$ arr[0]=element1
$ arr[5]=element
$ arr[9]=elementN

Если выполнять: echo ${arr[0]}
то выводится: element1

А если выполнить: echo $arr[0]
то выводится: element1[0]

Хотя было упомянуто, что «указывать скобки {} не обязательно.»
Почему тогда так получается?
При указании элементов массива в фигурных скобках, оболочка выводит только значение элемента, а без фигурных скобок также после значения его выводит порядковый номер элемента в массиве.
Цитата из «man bash» — раздел «Arrays(массивы)»:
Any  element  of  an  array may be referenced using ${name[subscript]}.  The braces are REQUIRED to avoid conflicts with pathname expansion. 

Литературный перевод:
фигурные скобки НЕОБХОДИМЫ обязательно.
Огромное спасибо за эту серию статей, вот уже думаю, как на сайте их «повесить в рамку»
Незачто :) Было бы интересно.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.