В bash можно создавать многомерные структуры, но выглядеть они будут ужасно и такой усложненный код сложнее поддерживать; ⇒ если нужны такие сложные структуры, то лучше реализовать их на другом ЯП.
Не все версии bash поддерживают хеши
Поддержка хешей появилась только в bash 4.0, после чего потребовалось еще пару релизов, чтобы отшливофать некоторые детали. К примеру, только в 4.3 в стало возможным юзать $list[-1] для ссылки на последний элемент вместо вот этого трэша:
Массивы не POSIX
Массивы (как списки, так и хеши) не стандартизированы в POSIX. ⇒ если парит переносимость кода за пределы bash - будь осторожен (ибо, например, синтаксис zsh отличается).
Случайное присваивание
Присваивание без указания нижнего индекса изменит нулевой элемент. ⇒myarray=fooсоздаст/изменит$myarray[0] (даже если это хеш!).
Про [@] и [*]
Индекс [@] или [*] возвращает все элементы.
Они различаются только когда ссылка на массив заключается в двойные кавычки " ". $name[*] развернется в одну строку $name[@] развернется в коллекцию строк с отдельными элементами массива.
Так что юзать: [@] или [*]?
Почти во всех случаях следует юзать [@].
Массивы (списки)
Объявление
Массивы (списки в bash так называются) могут объявляться w/:
или простым присваниванием:
Добавление элемента
После объявления списка можно добавлять элементы с помощью такого присваивания:
Длина списка или элемента
Объединение элементов
Обход значений
Обход значений с индексами элементов
Для этого нужен восклицательный знак ! перед названием списка.
Операции со срезами (slices)
Вывод
Присваивание среза
Удаление (pop) последнего элемента
Удаление срезов
Удаление всего списка
Осторожнее с unset
Если в файловой системе будет файл с именем, совпадающим с именем переменной, то поддержка подстановки имен файлов в командной оболочке может удалить этот файл.
Чтобы избежать этого, нужно:
заключить переменную в кавычки
юзать ключ -v, чтобы unset рассматривал аргумент как переменную.
Хеши (словари)
Объявление
Хеши (словари) обязательно должны объявляться w/:
Присваивание
Вывод некоторых деталей и контента
Объединение значений
Операции со срезами
Но работа со срезами выглядит странно, ибо индексы не порядковые номера.
Самое распространенное применение хешей - подсчет слов и/или “уникализация” элементов.
stdout:
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
Другие сценарии использования
Перенаправление результата выполнения команды в массив