Определение массивов в Bash
В отличии от переменной которая может хранить только одно значение, массивы могут хранить несколько значений.
Для объявления массива необходимо придумать имя идентификатора и указать в круглых скобках () список принимаемых значений. Значения с пробелом необходимо заключать в кавычки.
|
1 2 3 |
#!/bin/bash fruits=(orange apple "star fruit" banana) cars=( ) # Пустой массив |
В любой момент времени можно получить одно или несколько значений массива используя его идентификатор и индекс элемента указанных в квадратных скобках []. Индексация элементов начинается с нуля.
|
1 2 3 4 |
#!/bin/bash fruits=(orange apple "star fruit" banana) fruits[1]=watermelon # замена значения элемента с индексом 1. echo ${fruits[1]} |
meliorem@ubuntu:~$ fruits_array.sh
watermelon
Синтаксис работы с массивами
Чтобы обратится ко списку всех элементов массива подставьте символ @ вместо индекса.
|
1 2 3 |
#!/bin/bash fruits=(orange apple "star fruit" banana) echo ${fruits[@]} |
meliorem@ubuntu:~$ fruits_array.sh
orange apple star fruit banana
Для обращения к нескольким элементам массива используйте синтаксис ${array[@]:s:n}, где n - количество элементов начиная с элемента под индексом - s.
|
1 2 3 |
#!/bin/bash fruits=(orange apple "star fruit" banana) echo ${fruits[@]:1:2} |
meliorem@ubuntu:~$ fruits_array.sh
apple star fruit
Добавить новый элемент в массив можно используя оператор +=.
|
1 2 3 4 |
#!/bin/bash fruits=(orange apple "star fruit" banana) fruits+=(aprycot) echo ${fruits[@]} |
meliorem@ubuntu:~$ fruits_array.sh
orange apple star fruit banana aprycot
Узнать количество элементов в массиве ${#array[@]}.
|
1 2 3 |
#!/bin/bash fruits=(orange apple "star fruit" banana) echo ${#fruits[@]} |
meliorem@ubuntu:~$ fruits_array.sh
4
В массив можно сохранить результаты вывода команд.
|
1 2 3 |
#!/bin/bash folders=( $(ls) ) echo ${folders[@]} |
meliorem@ubuntu:~$ folders_array.sh
Desktop Documents Downloads Music Pictures Public
Обход элементов массива в цикле
Используя цикл for можно обойти все элементы в массиве.
|
1 2 3 4 5 |
#!/bin/bash files=( report.txt cat.jpg "My plans.doc" electro.mp3 ) for file in "${files[@]}"; do touch "${file}" done |
Чтобы обойти индексы элементов массива, добавьте знак ! к началу идентификатора.
|
1 2 3 4 5 |
#!/bin/bash numbers=( 45 88 4 ) for index in "${!numbers[@]}"; do echo "Элемент $index: ${numbers[$index]}" done |
meliorem@ubuntu:~$ for_index_array.sh
Элемент 0: 45
Элемент 1: 88
Элемент 2: 4
Особенности массивов в Bash
Если обратится к массиву без указания индекса, то будет возвращено значение первого элемента.
|
1 2 3 |
#!/bin/bash fruits=(orange apple "star fruit" banana) echo ${fruits} |
meliorem@ubuntu:~$ for_index_array.sh
orange
При обращении к элементам массива всегда заключайте его в фигурные скобки {} со знаком $ вначале. Если при обращении к элементу использовать синтаксис $fruits[1], то в Bash интерпретирует это как ссылку на первый элемент массива и строковый литерал [1].
|
1 2 3 |
#!/bin/bash fruits=(orange apple "star fruit" banana) echo $fruits[1] |
meliorem@ubuntu:~$ for_index_array.sh
orange[1]