Если какой-то кодер не поклоняется массивам, то вряд ли он хороший. :) Bash - это язык программирования оболочки, поэтому при кодировании Bash вам понадобятся массивы. В этой статье я кратко расскажу о логике работы с массивами в bash-скриптах. Мы будем рассматривать одномерные индексированные массивы и ассоциативные массивы (пары ключ, значение).

В математике массив относится к набору чисел или объектов, которые будут следовать определенному шаблону. Массив — это упорядоченное расположение (часто в строках, столбцах или матрице), которое чаще всего используется в качестве визуального инструмента для демонстрации умножения и деления. Массивы используются для ввода больших объемов данных в компьютер, их быстрой обработки и надлежащего хранения.

Является ли массив в программировании аналогом матрицы в математике? Да, особенно если вы допускаете двумерные массивы. Существует два типа массивов bash:

  • Индексированные массивы.к массиву относятся целые числа или числа.
  • Ассоциативные массивы.на массив ссылаются через строки или набор символов и слов.

В других продвинутых языках есть дополнительные многомерные массивы. Но помните, что bash не поддерживает многомерные массивы, поэтому невозможно добавить массив внутри массива.

Индексированный массив

Есть несколько способов объявить индексированные массивы в Bash. Между тем, стоит знать, что размер массива не нуждается в объявлении и начинается с 0 (нуля).

arr=()  #arr is an empty array.

Это создает пустую команду массива.

arr=("Batur" "Orkun" "DevOps")
arr=([0]="Batur" [1]="Orkun" [2]="DevOps")

Это создает команду, заполненную массивом данных. Как вам угодно, вы можете использовать индексы или нет.

arr=([1]="Batur" [0]="Orkun" [4]="DevOps")

Следовать за номерами индексов по порядку не нужно, и вы можете передать некоторые индексы, подобные приведенным выше.

echo ${arr[0]}   # Output: Orkun

Если вы хотите изменить значения, вы можете сделать это, как показано ниже.

arr[0]="New Surname"

Если вы хотите напечатать все значения, вам нужен символ «@». Обратите внимание, что важны индексы, а не порядок.

arr=([1]="Batur" [0]="Orkun" [4]="DevOps")
echo ${arr[@]}. # Output: Orkun Batur DevOps

Если вы любите придерживаться правил, используйте оператор «declare» для определения вашего массива. Но это не обязательно.

declare -a Arr

Arr=("Batur" "Orkun" "DevOps")

Давайте сделаем пример с циклом for.

#!/usr/bin/env bash

declare -a Arr=("Batur" "Orkun" "DevOPS")

for item in ${Arr[@]}; do
    echo "> $item"
done

### Output:

# > Batur
# > Orkun
# > DevOPS

Если вы хотите добавить новый элемент в массив, используйте оператор «+=».

declare -a Arr=("Batur" "Orkun" "DevOPS")

Arr+=("Hello")

for item in ${Arr[@]}; do
    echo "> $item"
done

### Output:

# > Batur
# > Orkun
# > DevOPS
# > HEYYY

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

В то время как индексированные массивы не требуют объявления («declare»), ассоциативные массивы требуют.

declare -A AssocArr
declare -A AssocArr=( [name]="batur" [surname]="Orkun" [title]="DevOps" )

Вы никогда не должны использовать символ «@» для печати всего, потому что порядок может быть другим. Например, для приведенного выше массива я вывел «Orkun DevOPS batur».

Если вы хотите изменить значения:

AssocArr[name]="BATUR"

Если вы хотите добавить новый элемент в массив, используйте оператор «+=».

AssocArr+=([os]="Linux"

Возможны множественные.

AssocArr+=([os]="Linux" [skill]="Kubernetes")

Если вы хотите удалить элемент из массива, используйте команду «unset».

unset AssocArr[name]

Вы также можете использовать циклы с массивами.

declare -A AssocArr=([name]="batur" [surname]="Orkun" [title]="DevOPS")
AssocArr+=([os]="Linux")
AssocArr+=([os]="Linux" [skill]="Kubernetes")
for key in ${!AssocArr[@]}; do
 echo "$key : ${AssocArr[$key]}"
done


### Output:

# surname : Orkun
# title : DevOPS
# skill : Kubernetes
# os : Linux
# name : batur

Дополнительное использование

Массивы часто являются идеальной структурой данных для создания и управления.

Скрипт, который обнаруживает файлы и каталоги в текущем каталоге и записывает их на экран.

list=( $(ls) )
for item in ${list[@]}; do
  if [ -d "../$item" ]; then
     echo "Directory $item"
  else
     echo "File $item"
  fi
done

Чтобы извлечь часть массива, вы можете использовать синтаксис, который:

${Арр[1]:s:n}

Этот синтаксис вернет часть массива, начинающуюся с позиции «s» и содержащую «n» элементов. Вы можете опустить часть «:n», чтобы извлечь все элементы из s до конца списка.

declare -a Arr=("Batur" "Orkun" "DevOPS")
echo ${Arr[1]:1:3}

### Output:
# rku

Для поиска и замены в массиве элементов вы можете использовать следующий синтаксис:

${Арр[1]/найти/заменить}

Этот синтаксис на самом деле является регулярным выражением (Regular Expression). Найдите первое ключевое слово и замените его вторым ключевым словом.

declare -a Arr=("Batur" "Orkun" "DevOPS")
echo ${Arr[1]/kun/-KUN}

### Output:
# Or-KUN

Заключение

Массивы в Bash могут иметь ограничения, но они предлагают ту же базовую функциональность, что и большинство языков программирования. Важно использовать последнюю версию Bash. Например, до версии 4 не было поддержки ассоциативных массивов. Однако Bash есть везде и является сильным языком программирования. Так что вы можете использовать его везде. Знание Bash — важный навык, независимо от того, являетесь ли вы разработчиком или занимаетесь DevOps.