Массивы и значения по умолчанию
Храним списки значений и аккуратно подставляем значения по умолчанию.
Массив в 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}требует обязательную переменную.