Массивы Bash

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

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

Массивы Bash

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Массивы Bash

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

Массивы Bash

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

Массивы Bash

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

Массивы Bash

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

Массивы Bash

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

Массивы Bash

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

Массивы Bash

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

Массивы Bash

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

Массивы Bash

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

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

Массивы Bash

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

echo “Введите элементы массива:”
read -a array
echo “Результат:”
for i in $
do
echo $i
done

Массивы Bash

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

Массивы Bash

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

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 “$
do
perm=$(ls -l $i)
if [ `expr $ : “-rwxr-xr-x”` -eq 10 ]; then
echo $
fi
done

Массивы Bash

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

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

Массивы Bash

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

declare -A assoc_array

Массивы Bash

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

declare -A matrix

Массивы Bash

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

Выводы

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