Массивы и значения по умолчанию

Храним списки значений и аккуратно подставляем значения по умолчанию.

Массив в Bash — это переменная, которая хранит упорядоченный список значений с индексами от нуля.

Создание и чтение массива

Массив задаётся в круглых скобках, элементы разделяются пробелами.

fruits=(яблоко банан вишня)
echo "${fruits[0]}"
echo "${fruits[2]}"
echo "Всего: ${#fruits[@]}"

Вывод:

яблоко
вишня
Всего: 3

${fruits[0]} — первый элемент (индексация с нуля), ${#fruits[@]} — количество элементов. Запись ${fruits[@]} разворачивает весь массив.

Перебор всех элементов

servers=(web1 web2 db1)
for s in "${servers[@]}"; do
  echo "Проверяю $s"
done

Вывод:

Проверяю web1
Проверяю web2
Проверяю db1

Кавычки вокруг "${servers[@]}" важны: они сохраняют элементы с пробелами как отдельные единицы.

Значения по умолчанию

Часто переменная может быть не задана, и нужно подставить запасное значение. Для этого есть конструкция ${VAR:-значение}.

echo "Папка: ${TARGET_DIR:-/tmp/backup}"
greeting=${NAME:-гость}
echo "Привет, $greeting"

Вывод:

Папка: /tmp/backup
Привет, гость

Если TARGET_DIR не задана или пуста, подставится /tmp/backup. Похожая форма ${VAR:?сообщение} завершит скрипт с ошибкой, если переменная пуста, — удобно для обязательных параметров.

ФормаПоведение, если VAR пуста
${VAR:-def}подставит def, VAR не меняется
${VAR:=def}подставит и присвоит def
${VAR:?msg}выйдет с ошибкой и текстом msg

Как работает под капотом

Bash хранит индексный массив как разреженную таблицу: индексы — целые числа, но не обязательно подряд. Разворачивание "${arr[@]}" даёт каждый элемент отдельным словом, а "${arr[*]}" склеивает их в одну строку через первый символ переменной IFS (обычно пробел). Подстановки по умолчанию вычисляются на этапе раскрытия параметров, ещё до запуска команды.

Частые ошибки

  • $arr вместо ${arr[@]}. Просто $arr вернёт только нулевой элемент, а не весь массив.
  • Перебор без кавычек. for s in ${servers[@]} разобьёт элементы с пробелами; нужны кавычки.
  • Путать :- и :=. Первая только подставляет, вторая ещё и присваивает переменной.

Итог

  • Массив создаётся как arr=(a b c), элементы — ${arr[i]}, длина — ${#arr[@]}.
  • Перебирайте через for x in "${arr[@]}" с кавычками.
  • ${VAR:-def} подставляет значение по умолчанию, ${VAR:?msg} требует обязательную переменную.
Проверьте себя
1. Как узнать количество элементов массива arr?
A${arr[count]}
B${#arr[@]}
C$arr.length
Dcount(arr)
2. Что подставит ${PORT:-8080}, если переменная PORT не задана?
AПустую строку
B8080
CОшибку
DИмя PORT
3. Почему массив перебирают как for x in "${arr[@]}", а не $arr?
A$arr вернёт только первый элемент массива
BТак быстрее
CКавычки обязательны в for
DРазницы нет