Индексированные массивы

Тема дорожной карты · Bash

Индексированные массивы в Bash — это коллекции с целочисленными ключами, индексация которых начинается с нуля; они объявляются с помощью declare -a arr или неявно как arr=(alpha beta gamma), где каждый элемент доступен по числовому индексу через ${arr[0]}, ${arr[1]} и так далее. Полный индексированный массив безопасно раскрывается с помощью "${arr[@]}" — с сохранением элементов, содержащих пробелы, — тогда как ${#arr[@]} возвращает количество элементов, а ${!arr[@]} — список индексов; все это необходимые идиомы для shell-скриптов на Linux. Добавление элемента в индексированный массив Bash осуществляется через arr+=(new_value), присваивание конкретному слоту — через arr[5]="value", а unset arr[2] удаляет элемент, оставляя пробел в индексах — особенность разреженных массивов в Bash, о которой должны знать авторы shell-скриптов. Индексированные массивы в Bash являются естественной заменой строк с пробелами в качестве разделителей, когда элементы могут содержать пробелы или специальные символы, и обеспечивают многие паттерны автоматизации: пакетную обработку файлов, накопление аргументов и сбор результатов в скриптах Linux. В сочетании с циклами for item in "${arr[@]}" индексированные массивы формируют основу логики обработки списков в Bash-скриптах.

Как это работает

Индексированные массивы: arr=(a b c) объявляет, ${arr[0]} — доступ по индексу, ${arr[@]} раскрывает все элементы как отдельные слова, ${arr[*]} как одно слово, ${#arr[@]} — длина, arr+=("new") добавляет. Associative arrays (bash 4+): declare -A map; map[key]=value. Цикл: for x in "${arr[@]}"; do ...; done. Slice: ${arr[@]:start:length}.

Когда применять

Массивы — для любого списка из нескольких элементов; никогда не используйте space-separated строку (баги word-splitting). Associative arrays (declare -A) — для key-value lookup (маленьких; для больших данных смените язык). Всегда "${arr[@]}" при итерации — без кавычек элементы с пробелами разделятся на несколько итераций.

Типичные ошибки

Ловушки Индексированные массивы: for x in ${arr[@]} без кавычек (элементы разделяются); ${arr[*]} когда хотели ${arr[@]} (разная семантика); bash 3-синтаксис на macOS (там bash 3.2 — нет associative arrays; ставьте bash 5 через brew).

Связанные понятия

Полезные ресурсы