Определение массивов в 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]