Массивы в Bash

Введение в Bash-скриптинг

Alex Scriven

Data Scientist

Что такое массив?

Два типа массивов в Bash:

  • Массив
    • Структура с числовой индексацией.
    • Аналог «списка» в Python или «вектора» в R.

В Python: my_list = [1,3,2,4]

В R: my_vector <- c(1,3,2,4)

Введение в Bash-скриптинг

Создание массива в Bash

Массив с числовой индексацией в Bash можно создать двумя способами.

1. Объявить без добавления элементов

declare -a my_first_array

2. Создать и сразу добавить элементы

my_first_array=(1 2 3)

Помните: пробелы вокруг знака равенства недопустимы!

Введение в Bash-скриптинг

Осторожно с запятыми!

В Bash элементы массива не разделяются запятыми:

Это неверно:

my_first_array=(1, 2, 3)

Это верно:

my_first_array=(1 2 3)
Введение в Bash-скриптинг

Важные свойства массивов

  • Все элементы массива возвращаются с помощью array[@]. Обратите внимание: Bash требует фигурных скобок вокруг имени массива при обращении к его свойствам.
my_array=(1 3 5 2)
echo ${my_array[@]}
1 3 5 2
  • Длина массива доступна через #array[@]
echo ${#my_array[@]}
4
Введение в Bash-скриптинг

Работа с элементами массива

Доступ к элементам массива осуществляется через квадратные скобки.

my_first_array=(15 20 300 42)
echo ${my_first_array[2]}
300
  • Помните: в Bash, как и в Python, массивы индексируются с нуля (в отличие от R!)
Введение в Bash-скриптинг

Работа с элементами массива

Задайте значение элемента массива через индексную нотацию.

my_first_array=(15 20 300 42 23 2 4 33 54 67 66)

my_first_array[0]=999
echo ${my_first_array[0]}
999
  • Помните: при перезаписи элемента по индексу не используйте $, например $my_first_array[0]=999 — это не сработает.
Введение в Bash-скриптинг

Работа с элементами массива

Используйте нотацию array[@]:N:M, чтобы выбрать срез массива.

  • Здесь N — начальный индекс, M — количество возвращаемых элементов.
my_first_array=(15 20 300 42 23 2 4 33 54 67 66)
echo ${my_first_array[@]:3:2}
42 23
Введение в Bash-скриптинг

Добавление элементов в массив

Добавляйте элементы в массив с помощью array+=(elements).

Например:

my_array=(300 42 23 2 4 33 54 67 66)

my_array+=(10) echo ${my_array[@]}
300 42 23 2 4 33 54 67 66 10
Введение в Bash-скриптинг

Неверное добавление в массив

Что будет, если не добавить скобки вокруг добавляемого элемента? Посмотрим.

Например:

my_array=(300 42 23 2 4 33 54 67 66)
my_array+=10
echo ${my_array[@]}
30010 42 23 2 4 33 54 67 66

Строка 10 просто добавится к первому элементу. Не то, что нам нужно!

Введение в Bash-скриптинг

Ассоциативные массивы

  • Ассоциативный массив
    • Похож на обычный массив, но использует пары «ключ — значение» вместо числовых индексов
    • Аналог словаря в Python или списка в R
    • Примечание: доступен только начиная с Bash 4. На некоторых современных Mac установлена старая версия Bash! Проверьте командой bash --version в терминале

В Python:

my_dict = {'city_name': "New York", 'population': 14000000}

В R:

my_list = list(city_name = c('New York'), population = c(14000000))
Введение в Bash-скриптинг

Создание ассоциативного массива

Ассоциативный массив можно создать только с помощью синтаксиса declare (с флагом -A в верхнем регистре).

Можно сначала объявить массив, а затем добавить элементы, или сделать всё в одну строку.

  • Ключи заключаются в квадратные скобки, значение указывается после знака равенства.
    • Можно добавить несколько элементов одновременно.
Введение в Bash-скриптинг

Пример ассоциативного массива

Создадим ассоциативный массив:

declare -A city_details # Declare first

city_details=([city_name]="New York" [population]=14000000) # Add elements
echo ${city_details[city_name]} # Index using key to return a value
New York
Введение в Bash-скриптинг

Создание ассоциативного массива

Можно также объявить ассоциативный массив и сразу присвоить значения в одну строку

  • Всё остальное остаётся прежним
declare -A city_details=([city_name]="New York" [population]=14000000)

Для доступа к ключам ассоциативного массива используйте !

echo ${!city_details[@]} # Return all the keys
city_name population
Введение в Bash-скриптинг

Давайте потренируемся!

Введение в Bash-скриптинг

Preparing Video For Download...