Массивы в Bash: Полное руководство с примерами для автоматизации

Массивы в Bash: Полное руководство с примерами для автоматизации

Вы пишете скрипты, которые превращаются в бесконечные списки переменных? Хватит это терпеть! Есть способ организовать данные в ваших bash-скриптах быстро, эффективно и элегантно. Массивы Bash — это ваш пропуск в мир профессиональной автоматизации. Они позволяют упаковать множество значений в одну удобную структуру, будь то список файлов, имен пользователей или любых других данных. Представьте, что вы можете обрабатывать сотни элементов всего несколькими строками кода. Больше никакого хаоса с var1, var2, var3... Вы узнаете, как создавать массивы несколькими способами: простым перечислением элементов, чтением данных прямо с клавиатуры или даже из вывода других команд. Мы разберем, как обращаться к любому элементу по его индексу, причем нумерация начинается с нуля. Вы сможете выводить не только отдельные значения, но и срезы — целые диапазоны данных одним махом. Узнаете, как быстро подсчитать количество элементов или длину любого из них. А для сложных задач мы покажем, как легко перебирать массивы в циклах, выполняя с каждым элементом нужные вам действия. Откройте для себя мощь ассоциативных массивов, где в качестве индекса можно использовать строки, а не только цифры. Это открывает совершенно новые возможности для организации данных в ваших сценариях. Готовы упростить свой код и сделать его в разы мощнее? Всё, что вам нужно, ждет вас в полной версии статьи. Переходите и превратите свои скрипты в образец чистоты и эффективности!


Невозможно представить себе язык программирования, который не поддерживал бы массивов. Под массивами обычно подразумеваются упорядоченные списки строк, символов или любых других объектов. Неважно как они реализованы в большинстве языков программирования, они помогают лучше управлять данными.

Язык сценариев Bash тоже имеет свои возможности работы с массивами. В этой статье мы рассмотрим как работают массивы Bash, как их создавать и использовать. В некоторых случаях это очень удобно.


Содержание статьи

Массивы Bash

Массивы оболочки Bash работают почти так же, как и в других языках программирования. Перед тем как вы сможете использовать массив, его нужно объявить. Это можно сделать несколькими способами, первый из них - это использование команды оболочки declare:

declare -a имя_массива

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

имя_массива[XX] = значение

Здесь XX обозначает индекс массива. Еще один удобный способ создавать массивы строк Bash - это просто перечислить все элементы в круглых скобках:

имя_массива=( элемент_1 элемент_2 элемент_3 ... )

Или вы можете сразу задать индекс массива для каждого из элементов:

имя_массива=( [XX]=значение [XX]=значение . . . )

Также можно прочитать значения для массива из клавиатуры или другого источника ввода:

read -a имя_массива

При вводе элементов массива они должны быть разделены символом пробела. Для получения значений элементов массива используйте синтаксис фигурных скобок, обратите внимание, что нумерация элементов массива, как и в большинстве языков начинается с нуля:

${имя_массива[XX]}

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

Примеры использования массивов Bash

Теперь рассмотрим примеры массивов bash. Сначала нам нужно создать массив, который мы будем использовать для примеров, на мой взгляд будет проще использовать синтаксис с круглыми скобками. Вообще, массивы используются в скриптах, но мы будем их применять прямо в оболочке Bash. Для начала так будет проще. Создаем массив:

array=(первый второй третий четвертый пятый)

Массивы в Bash: Полное руководство с примерами для автоматизации

Теперь попытаемся вывести один из элементов массива по его индексу:

echo ${array[1]}
$ echo ${array[2]}
$ echo ${array[0]}

Массивы в Bash: Полное руководство с примерами для автоматизации

Чаще всего используются массивы строк Bash, но иногда могут встречаться и цифры. Помните про нумерацию? Индексы элементов массива начинаются с нуля. Для вывода значения элемента по индексу можно использовать и немного другой синтаксис:

echo ${array:0}

Массивы в Bash: Полное руководство с примерами для автоматизации

Вы можете вывести все элементы:

echo ${array[@]}

Массивы в Bash: Полное руководство с примерами для автоматизации

Все элементы, начиная с номера 1:

echo ${array[@]:1}

Массивы в Bash: Полное руководство с примерами для автоматизации

Вывести все элементы которые находятся в диапазоне от 1 до 4:

echo ${array[@]:1:4}

Массивы в Bash: Полное руководство с примерами для автоматизации

Чтобы узнать длину первого элемента выполните:

echo ${#array[0]}

Массивы в Bash: Полное руководство с примерами для автоматизации

А посмотреть количество элементов массива Bash можно таким же синтаксисом:

echo ${#array[@]}

Массивы в Bash: Полное руководство с примерами для автоматизации

Кроме всего прочего, вы можете заменить одни символы в определенном элементе массива или во всем массиве на другие. Для этого используйте:

echo ${array[@]//р/Р}

Массивы в Bash: Полное руководство с примерами для автоматизации

В некоторых случаях, для перебора элементов массива очень удобно использовать циклы. На этот раз сделаем небольшой скрипт:

#!/bin/bash

array=(первый второй третий четвертый пятый)
for i in ${array[@]}
do
echo $i
done

Массивы в Bash: Полное руководство с примерами для автоматизации

Внутри цикла вы можете делать со значением элемента все, что вам нужно. Как я уже писал выше, вы можете прочитать значения для массива с помощью функции read:

#!/bin/bash

echo "Введите элементы массива:"
read -a array
echo "Результат:"
for i in ${array[@]}
do
echo $i
done

Массивы в Bash: Полное руководство с примерами для автоматизации

Как и в любом другом варианте, вам нужно, чтобы все элементы были разделены пробелом. Точно так же можно присвоить массиву результат выполнения команды. Например, сохраним список файлов, полученный от ls:

 array=( $(ls /) )

Массивы в Bash: Полное руководство с примерами для автоматизации

Усложним задачу и сделаем скрипт, который будет выводить все файлы из указанной директории, которые имеют права доступа 755:

vi lsperm.sh

#!/bin/bash

ERR=27
EXT=0

if [ $# -ne 1 ]; then
echo "Используйте: $0 <путь>"
exit $ERR
fi

if [ ! -d $1 ]; then
echo "Каталог $1 не существует"
exit $ERR
fi

temp=( $(find $1 -maxdepth 1 -type f) )

for i in "${temp[@]}"
do
perm=$(ls -l $i)
if [ `expr ${perm:0:10} : "-rwxr-xr-x"` -eq 10 ]; then
echo ${i##*/}
fi
done

exit $EXT

Массивы в Bash: Полное руководство с примерами для автоматизации

Теперь проверим наш скрипт на папке /bin. Но перед этим нужно дать ему права на выполнение:

chmod u+x ./lsperm.sh
$ ./lsperm.sh

Массивы в Bash: Полное руководство с примерами для автоматизации

Как видите, все работает. Кроме номеров, в качестве индексов для массивов можно использовать строки. Такие массивы Bash называются ассоциативными и поддерживаются они начиная с четвертной версии Bash. Для создания ассоциативного массива используется declare с опцией -A:

declare -A assoc_array

assoc_array[first]=первый
$ assoc_array[last]=последний

echo ${assoc_array[first]}
$ echo ${assoc_array[last]}

Массивы в Bash: Полное руководство с примерами для автоматизации

Несмотря на то что Bash поддерживает только одномерные массивы, мы можем выполнять симуляцию работы с многомерными матрицами с помощью ассоциативных массивов:

declare -A matrix

arr[0,0]=0
$ arr[0,1]=1
$ arr[1,0]=2
$ arr[1,1]=3

echo "${arr[0,0]} ${arr[0,1]}"

Массивы в Bash: Полное руководство с примерами для автоматизации

Чтобы удалить массив, созданный с помощью declare используйте функцию unset:

unset matrix

Выводы

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

Оставить комментарий


Кликните на изображение чтобы обновить код, если он неразборчив