# Атрибуты.
Attrib[1]=" А.С. Пушкин"
Attrib[2]="\"Евгений Онегин\""
for index in 1 2 3 4 5 # Пять строк.
do
printf " %s\n" "${Line[index]}"
done
for index in 1 2 # Две строки дополнительных атрибутов.
do
printf " %s\n" "${Attrib[index]}"
done
exit 0
При работе с отдельными элементами массива можно использовать специфический синтаксис, даже стандартные команды и операторы Bash адаптированы для работы с массивами.
array=( ноль один два три четыре пять )
echo ${array[0]} # ноль
echo ${array:0} # ноль
# Подстановка параметра -- первого элемента.
echo ${array:1} # оль
# Подстановка параметра -- первого элемента,
#+ начиная с позиции #1 (со 2-го символа).
echo ${#array} # 4
# Длина первого элемента массива.
array2=( [0]="первый элемент" [1]="второй элемент" [3]="четвертый элемент" )
echo ${array2[0]} # первый элемент
echo ${array2[1]} # второй элемент
echo ${array2[2]} #
# Элемент неинициализирован, поэтому на экран ничего не выводится.
echo ${array2[3]} # четвертый элемент
При работе с массивами, некоторые встроенные команды Bash имеют несколько иной смысл. Например, unset -- удаляет отдельные элементы массива, или даже массив целиком.
Пример 25-3. Некоторые специфичные особенности массивов
#!/bin/bash
declare -a colors
# Допускается объявление массива без указания его размера.
echo "Введите ваши любимые цвета (разделяя их пробелами)."
read -a colors # Введите хотя бы 3 цвета для демонстрации некоторых свойств массивов.
# Специфический ключ команды 'read',
#+ позволяющий вводить несколько элементов массива.
echo
element_count=${#colors[@]}
# Получение количества элементов в массиве.
# element_count=${#colors[*]} -- дает тот же результат.
#
# Переменная "@" позволяет "разбивать" строку в кавычках на отдельные слова
#+ (выделяются слова, разделенные пробелами).
index=0
while [ "$index" -lt "$element_count" ]
do # Список всех элементов в массиве.
echo ${colors[$index]}
let "index = $index + 1"
done
# Каждый элемент массива выводится в отдельной строке.
# Если этого не требуется, то используйте echo -n "${colors[$index]} "
#
# Эквивалентный цикл "for":
# for i in "${colors[@]}"
# do
# echo "$i"
# done
# (Спасибо S.C.)
echo
# Еще один, более элегантный, способ вывода списка всех элементов массива.
echo ${colors[@]} # ${colors[*]} дает тот же результат.
echo
# Команда "unset" удаляет элементы из массива, или даже массив целиком.
unset colors[1] # Удаление 2-го элемента массива.
# Тот же эффект дает команда colors[1]=
echo ${colors[@]} # Список всех элементов массива -- 2-й элемент отсутствует.
unset colors # Удаление всего массива.
# Тот же эффект имеют команды unset colors[*]
#+ и unset colors[@].
echo; echo -n "Массив цветов опустошен."
echo ${colors[@]} # Список элементов массива пуст.
exit 0
Как видно из предыдущего примера, обращение к ${array_name[@]} или ${array_name[*]} относится ко
Пример 25-4. Пустые массивы и пустые элементы
#!/bin/bash
# empty-array.sh
# Выражаю свою благодарность Stephane Chazelas за этот пример,
#+ и Michael Zick за его доработку.
# Пустой массив -- это не то же самое, что массив с пустыми элементами.
array0=( первый второй третий )
array1=( '' ) # "array1" имеет один пустой элемент.
array2=( ) # Массив "array2" не имеет ни одного элемента, т.е. пуст.
echo
ListArray()
{
echo
echo "Элементы массива array0: ${array0[@]}"
echo "Элементы массива array1: ${array1[@]}"
echo "Элементы массива array2: ${array2[@]}"
echo
echo "Длина первого элемента массива array0 = ${#array0}"
echo "Длина первого элемента массива array1 = ${#array1}"
echo "Длина первого элемента массива array2 = ${#array2}"
echo
echo "Число элементов в массиве array0 = ${#array0[*]}" # 3
echo "Число элементов в массиве array1 = ${#array1[*]}" # 1 (сюрприз!)
echo "Число элементов в массиве array2 = ${#array2[*]}" # 0
}
# ===================================================================
ListArray
# Попробуем добавить новые элементы в массивы
# Добавление новых элементов в массивы.
array0=( "${array0[@]}" "новый1" )
array1=( "${array1[@]}" "новый1" )
array2=( "${array2[@]}" "новый1" )
ListArray
# или
array0[${#array0[*]}]="новый2"
array1[${#array1[*]}]="новый2"
array2[${#array2[*]}]="новый2"
ListArray
# Теперь представим каждый массив как 'стек' ('stack')
# Команды выше, можно считать командами 'push' -- добавление нового значения на вершину стека
# 'Глубина' стека:
height=${#array2[@]}
echo
echo "Глубина стека array2 = $height"
# Команда 'pop' -- выталкивание элемента стека, находящегося на вершине: