В bash можно создавать многомерные структуры, но выглядеть они будут ужасно и такой усложненный код сложнее поддерживать; ⇒ если нужны такие сложные структуры, то лучше реализовать их на другом ЯП.
Не все версии bash поддерживают хеши
Поддержка хешей появилась только в bash 4.0, после чего потребовалось еще пару релизов, чтобы отшливофать некоторые детали. К примеру, только в 4.3 в стало возможным юзать $list[-1] для ссылки на последний элемент вместо вот этого трэша:
Массивы не POSIX
Массивы (как списки, так и хеши) не стандартизированы в POSIX. ⇒ если парит переносимость кода за пределы bash - будь осторожен (ибо, например, синтаксис zsh отличается).
Случайное присваивание
Присваивание без указания нижнего индекса изменит нулевой элемент. ⇒myarray=fooсоздаст/изменит$myarray[0] (даже если это хеш!).
и [*]
Индекс [@] или [*] возвращает все элементы.
Они различаются только когда ссылка на массив заключается в двойные кавычки (”). $name[*]развернется в одну строку $name[@]развернется в коллекцию строк с отдельными элементами массива.
или [*] ?
Почти во всех случаях следует юзать [@].
Массивы (списки)
Объявление
Массивы (списки в bash так называются) могут объявляться w/:
или простым присваниванием:
Добавление элемента
После объявления списка можно добавлять элементы с помощью такого присваивания:
Длина списка или элемента
Объединение элементов
Обход значений
Обход значений с индексами элементов
Для этого нужен восклицательный знак (!) перед названием списка.
Операции со срезами (slices)
Вывод
Присваивание
# Срез, начинающийся с первого элемент, кавычки обязательны
mylist=("${mylist[@]:1}")
# Срез, начинающийся с элемента #count
mylist=("$mylist[@]:$count")
Удаление (pop) последнего элемента
Удаление срезов
Удаление всего списка
Осторожнее с unset
Если в файловой системе будет файл с именем, совпадающим с именем переменной, то поддержка подстановки имен файлов в командной оболочке может удалить этот файл.
Чтобы избежать этого, нужно:
заключить переменную в кавычки
юзать ключ -v, чтобы unset рассматривал аргумент как переменную.
Хеши (словари)
Объявление
Хеши (словари) обязательно должны объявляться w/ :
Присваивание
Вывод некоторых деталей и контента
Объединение значений
Операции со срезами
Но работа со срезами выглядит странно, ибо индексы не порядковые номера.
Самое распространенное применение хешей - подсчет слов и/или “уникализация” элементов.
Результат выполнения кода
Unique words from: /tmp/words.txt
bar
baz
foo
four
one
three
two
Word counts, ordered by word, from: /tmp/words.txt
bar 7
baz 4
foo 5
four 6
one 2
three 4
two 7
Word counts, ordered by count, from: /tmp/words.txt
one 2
baz 4
three 4
foo 5
four 6
bar 7
two 7
Другие сценарии использования
Перенаправление результата выполнения команды в массив
Выбор рандомных элементов из списка
Запись из списка/файла в хеш
Соус: Книга “Идиомы Bash” → Глава 7. “Списки и хэши”