Работа с массивами в Bash-скриптах является ключевым навыком при автоматизации задач в среде Unix-подобных операционных систем. Объявление массива bash позволяет структурировать данные и эффективно управлять множественными значениями в рамках одного переменного пространства.
В Bash существуют два основных способа объявления массива:
Однострочное объявление с элементами:
basharray_name=(element1 element2 element3)
Пошаговое добавление элементов по индексу:
basharray_name[0]=element1 array_name[1]=element2
Оба варианта считаются корректными и используются в зависимости от ситуации. При необходимости массив можно инициализировать пустым: empty_array=()
.
Массивы в Bash индексируются с нуля. Для получения значения элемента используется синтаксис ${array_name[index]}
. Например:
bashecho ${array_name[1]}
Для получения всех элементов массива применяется форма ${array_name[@]}
или ${array_name[*]}
.
Для изменения существующего значения в массиве достаточно присвоить новое значение нужному индексу:
basharray_name[2]="new_value"
Чтобы добавить элемент в конец массива, можно воспользоваться встроенной возможностью расширения:
basharray_name+=("new_element")
Для обхода всех значений массива удобно использовать цикл for
:
bashfor item in "${array_name[@]}"; do echo "$item" done
Альтернативный способ — использование цикла с индексами:
bashfor i in "${!array_name[@]}"; do echo "Index $i: ${array_name[$i]}" done
В Bash поддерживаются:
Обычные массивы с числовыми индексами.
Ассоциативные массивы, в которых используются строковые ключи.
Ассоциативный массив объявляется следующим образом:
bashdeclare -A assoc_array assoc_array[key1]="value1" assoc_array[key2]="value2"
Для использования ассоциативных массивов необходимо применять declare -A
.
Проверить наличие определённого индекса можно через условие:
bashif [[ -v array_name[2] ]]; then echo "Элемент существует" fi
Для ассоциативных массивов это также актуально.
Для удаления отдельного элемента массива используется команда unset
:
bashunset array_name[1]
Удаление всего массива осуществляется командой:
bashunset array_name
Массивы можно передавать в функции через глобальные переменные или ссылки:
bashmy_function() { local arr=("${@}") echo "${arr[0]}" } my_function "${array_name[@]}"
Передача по ссылке возможна с помощью nameref
(начиная с Bash 4.3):
bashmy_function() { local -n ref=$1 ref[0]="modified" } my_function array_name
Bash не поддерживает многомерные массивы напрямую.
Размер массива можно получить через ${#array_name[@]}
.
Пустые индексы сохраняются, что может влиять на логику обработки.
Частые ошибки:
Пропущенные кавычки при работе со строками, содержащими пробелы.
Использование ассоциативных массивов без предварительного declare -A
.
Неправильное использование ${array_name[*]}
вместо ${array_name[@]}
при переборе значений.
Как объявить пустой массив в bash?
Пустой массив объявляется командой array_name=()
.
Как узнать количество элементов в массиве bash?
С помощью конструкции ${#array_name[@]}
можно получить число элементов.
Как проверить, существует ли индекс в массиве?
Команда [[ -v array_name[index] ]]
позволяет проверить наличие элемента по индексу.
Можно ли использовать строки в качестве индексов в массиве bash?
Да, но только в ассоциативных массивах, объявленных через declare -A
.
Чем отличается ${array[*]}
от ${array[@]}
?
${array[@]}
сохраняет разделение элементов при переборе, тогда как ${array[*]}
объединяет их в одну строку.