Массивы в bash: синтаксис и примеры
Кратко
Массивы в bash — простой способ хранить упорядоченные наборы значений. Они одномерны и требуют специфичного синтаксиса для инициализации, доступа и итерации. В этой статье — базовый синтаксис, распространённые приёмы, примеры, типичные ошибки и практическая шпаргалка.

Базовый синтаксис массивов в bash
Создать массив в bash просто. Самый прямой способ — инициализировать весь массив в одной строке:
#!/bin/bash
city=(London Paris Milan "New York")Это создаёт массив из четырёх элементов с индексами 0..3. Обратите внимание: значения, содержащие пробелы (например, “New York”), нужно заключать в кавычки, чтобы bash не расценил их как отдельные элементы.
Обращение к отдельному элементу похоже на другие языки, но с парой особенностей. Сам по себе индекс записывается так:
city[2]Чтобы использовать значение в выражении, нужно:
- Добавить префикс “$” перед именем переменной.
- Обернуть имя переменной в фигурные скобки, чтобы bash правильно разобрал индекс: ${city[2]}.
Итоговый шаблон доступа к элементу:
${variable_name[index]}Полный пример:
#!/bin/bash
city=(London Paris Milan "New York")
echo ${city[3]}
# Выведет: New YorkВместо инициализации сразу можно присваивать значения поэтапно:
#!/bin/bash
city[0]=London
city[1]=Paris
city[2]=Milan
city[3]="New York"
echo ${city[3]}
# Выведет: New YorkВажно: вокруг знака равенства не должно быть пробелов. Запись вида city[0] = London вызовет ошибку.
Итерация и комбинирование с командами
Массивы удобно комбинировать с командной подстановкой $(cmd). Например, получить массив файлов в текущей директории:
arr=( $(ls) )Для итерации по всем элементам используйте форму “for … in” и специальную подстановку ${arr[@]}:
for file in "${arr[@]}"; do
wc -l "$file"
done
# Пример вывода:
# 3 envvars
# 547 httpd.confОбратите внимание на кавычки вокруг “${arr[@]}” — они сохраняют элементы с пробелами как целые значения.
Полезные операции с массивами
- Узнать длину массива (количество элементов):
echo ${#city[@]}
# 4- Добавить элемент в конец:
arr+=(4)Пример с городами:
city+=(Rome)
echo ${city[@]}
# London Paris Milan New York Rome- Взять срез массива (аналог slice):
${arr[@]:s:n}Это вернёт срез начиная с позиции s длины n. Если опустить “:n”, вернётся всё от s до конца.
echo ${city[@]:2:2}
# Milan New York
echo ${city[@]:3}
# New York RomeПример: небольшая таблица значений
Можно использовать массивы как простую таблицу соответствий. Например, скрипт для возведения определённых чисел в квадрат (ограниченная таблица):
#!/bin/bash
sqrt[1]=1
sqrt[4]=2
sqrt[9]=3
sqrt[16]=4
sqrt[25]=5
echo ${sqrt[$1]}Запуск: ./sqrt.sh 9 Вывод: 3
Этот приём — быстрый и удобный, когда у вас небольшое статическое соответствие индексов и значений.
Ограничения и когда массивы bash не подходят
Important: массивы в bash — одномерные и предназначены для простых задач. Причины не использовать массивы bash:
- Нужны многомерные структуры или сложные записи — лучше использовать CSV/JSON и парсить с помощью jq, Python или awk.
- Большие объёмы данных, где важна производительность — Python/Go/Perl быстрее и удобнее.
- Необходима строгая типизация или структуры с полями — лучше язык с поддержкой структур.
Если нужен словарь (асссоциативный массив), в bash 4+ есть поддержку associative arrays:
declare -A dict
dict[apple]=red
echo ${dict[apple]}Частые ошибки и отладка
- Пробелы вокруг знака ‘=’ при присваивании — синтаксическая ошибка.
- Забытые кавычки вокруг “${arr[@]}” — элементы с пробелами разобьются.
- Использование ${var[2]} без фигурных скобок или знака $ — неверный синтаксис.
Совет для отладки: включите set -x в начале скрипта, чтобы видеть выполняемые команды.
Альтернативные подходы
- Для работы с табличными данными используйте awk или Python. Они более выразительны и масштабируемы.
- Для небольших словарей в интерактивных скриптах пригодны associative arrays (bash 4+).
- Если нужно хранить сложные структуры, сериализуйте в JSON и используйте jq или парсер в целевом языке.
Чек-лист перед использованием массивов в скрипте
- Проверил версию bash (associative arrays доступны в 4+).
- Обработал возможные пробелы в элементах (использовал кавычки).
- Избегаю пробелов вокруг ‘=’ при присваивании.
- При итерации использую “${arr[@]}” и ставлю кавычки вокруг переменной.
- Если данные большие или сложные — рассмотрел альтернативы (Python/jq).
Шпаргалка: краткие примеры
# Инициализация
arr=(a b "c d")
# Доступ к элементу
echo ${arr[1]}
# Все элементы
echo ${arr[@]}
# Количество
echo ${#arr[@]}
# Добавить
arr+=(e)
# Срез
echo ${arr[@]:1:2}
# Associative (bash 4+)
declare -A map
map[key]=valueКраткий глоссарий (1 строка каждый)
- arr[@] — все элементы массива как список.
- arr[*] — похож на arr[@], но поведение при кавычках отличается.
- ${#arr[@]} — количество элементов в массиве.
- declare -A — объявление ассоциативного массива.
Когда это не сработает
- Если нужно хранить вложенные массивы или объекты — bash неудобен.
- Если ожидается поток больших данных — лучше выбрать более производительный инструмент.
Резюме
Массивы в bash просты и полезны в скриптах для хранения списков и небольших таблиц соответствий. Главное — помнить об одномерности, о кавычках при работе с элементами и о том, что для сложных задач стоит выбрать более подходящий язык.
Важно: если вы используете ассоциативные массивы, убедитесь, что у вас bash версии 4 или новее.
Похожие материалы
RDP: полный гид по настройке и безопасности
Android как клавиатура и трекпад для Windows
Советы и приёмы для работы с PDF
Calibration в Lightroom Classic: как и когда использовать
Отключить Siri Suggestions на iPhone