- Массивы в Bash
- Bash массивы
- Создание массивов в Bash
- Создание массивов с числовой индексацией
- Создание ассоциативных массивов
- Операции с массивами
- Справочные элементы
- Длина массива
- Прокрутите массив
- Добавить новый элемент
- Удалить элемент
- Выводы
- Глава 25. Массивы
- Массивы Bash
- Массивы Bash
- Примеры использования массивов Bash
- Выводы
Массивы в Bash
Массивы — одна из наиболее часто используемых и фундаментальных структур данных. Вы можете думать о массиве как о переменной, которая может хранить в себе несколько переменных.
В этой статье мы рассмотрим массивы Bash и объясним, как их использовать в сценариях Bash.
Bash массивы
Bash поддерживает одномерные типы массивов с числовым индексом и ассоциативные массивы. Для ссылок на числовые массивы используются целые числа, а для ассоциативных ссылок — с помощью строк.
Доступ к массивам с числовым индексом можно получить с конца, используя отрицательные индексы, индекс -1 ссылается на последний элемент. Индексы не обязательно должны быть смежными.
В отличие от большинства языков программирования, элементы массива Bash не обязательно должны иметь один и тот же тип данных. Вы можете создать массив, содержащий как строки, так и числа.
Bash не поддерживает многомерные массивы, и у вас не может быть элементов массива, которые также являются массивами.
Нет ограничений на максимальное количество элементов, которые могут храниться в массиве.
Создание массивов в Bash
Массивы в Bash можно инициализировать по-разному.
Создание массивов с числовой индексацией
Переменные Bash не типизированы, любая переменная может использоваться как индексированный массив без ее объявления.
Чтобы явно объявить массив, используйте встроенную команду declare:
Один из способов создать индексированный массив — использовать следующую форму:
Где index_* — положительное целое число.
Другой способ создать числовой массив — указать список элементов в круглых скобках, разделенных пустым пространством:
Когда массив создается с использованием формы выше, индексация начинается с нуля, то есть первый элемент имеет индекс 0 .
Создание ассоциативных массивов
В отличие от числовых индексов, ассоциативные массивы должны быть объявлены до того, как их можно будет использовать.
Чтобы объявить ассоциативный массив, используйте встроенную команду declare с параметром -A (верхний регистр):
Ассоциативные массивы можно создавать, используя следующую форму:
Где index_* может быть любой строкой.
Вы также можете создать ассоциативный массив, используя форму ниже:
Операции с массивами
Синтаксис массивов Bash сначала может показаться немного странным, но, когда вы прочтете эту статью, он станет более понятным.
Справочные элементы
Чтобы ссылаться на один элемент, вам необходимо знать индекс элемента.
На любой элемент можно ссылаться, используя следующий синтаксис:
Распечатаем элемент с индексом 1 :
Если вы используете @ или * в качестве индекса, слово расширяется до всех членов массива. Чтобы распечатать все элементы, вы должны использовать:
Единственная разница между @ и * состоит в том, что форма $
Чтобы распечатать ключи массива, добавьте ! оператор перед именем массива:
Длина массива
Чтобы получить длину массива, используйте следующую форму:
Прокрутите массив
Наиболее распространенный способ перебора каждого элемента в массиве — использование цикла for :
Приведенный выше код будет перебирать массив и печатать каждый элемент в новой строке:
Вот пример того, как распечатать все ключи и значения:
Другой способ перебрать массив — получить длину массива и использовать цикл в C style
Добавить новый элемент
Чтобы добавить новый элемент в массив bash и указать его индекс, используйте следующую форму:
Другой способ добавления нового элемента в массив без указания индекса — использование оператора += . Вы можете добавить один или несколько элементов:
Удалить элемент
Чтобы удалить один элемент, вам нужно знать индекс элемента. Элемент можно удалить с помощью команды unset :
Посмотрим на пример:
Выводы
Мы объяснили, как создавать числовые индексированные и ассоциативные массивы. Мы также показали, как перебирать массивы, вычислять длину массива, а также добавлять и удалять элементы.
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.
Источник
Глава 25. Массивы
Новейшие версии Bash поддерживают одномерные массивы. Инициализация элементов массива может быть произведена в виде: variable[xx]. Можно явно объявить массив в сценарии, с помощью директивы declare: declare -a variable. Обращаться к отдельным элементам массива можно с помощью фигурных скобок, т.е.: $ .
Пример 25-1. Простой массив
Bash позволяет оперировать переменными, как массивами, даже если они не были явно объявлены таковыми.
Эти примеры еще раз подтверждают отсутствие контроля типов в Bash.
Пример 25-2. Форматирование стихотворения
При работе с отдельными элементами массива можно использовать специфический синтаксис, даже стандартные команды и операторы Bash адаптированы для работы с массивами.
При работе с массивами, некоторые встроенные команды Bash имеют несколько иной смысл. Например, unset — удаляет отдельные элементы массива, или даже массив целиком.
Пример 25-3. Некоторые специфичные особенности массивов
Как видно из предыдущего примера, обращение к $ или $ относится ко всем элементам массива. Чтобы получить количество элементов массива, можно обратиться к $ или к $ . $ — это длина (количество символов) первого элемента массива, т.е. $ .
Пример 25-4. Пустые массивы и пустые элементы
Разница между $ и $ такая же, как между $@ и $*. Эти свойства массивов широко применяются на практике.
Операция подстановки команд — array=( element1 element2 . elementN ), позволяет загружать содержимое текстовых файлов в массивы.
Пример 25-5. Копирование и конкатенация массивов
Массивы допускают перенос хорошо известных алгоритмов в сценарии на языке командной оболочки. Хорошо ли это — решать вам.
Пример 25-6. Старая, добрая: «Пузырьковая» сортировка
Можно ли вложить один массив в другой?
Вложенные массивы, в комбинации с косвенными ссылками, предоставляют в распоряжение программиста ряд замечательных возможностей
Пример 25-7. Вложенные массивы и косвенные ссылки
С помощью массивов, на языке командной оболочки, вполне возможно реализовать алгоритм Решета Эратосфена . Конечно же — это очень ресурсоемкая задача. В виде сценария она будет работать мучительно долго, так что лучше всего реализовать ее на каком либо другом, компилирующем, языке программирования, таком как C.
Пример 25-8. Пример реализации алгоритма Решето Эратосфена
Сравните этот сценарий с генератором простых чисел, не использующим массивов, Пример A-18.
Массивы позволяют эмулировать некоторые структуры данных, поддержка которых в Bash не предусмотрена.
Пример 25-9. Эмуляция структуры «СТЕК» («первый вошел — последний вышел»)
Иногда, манипуляции с «индексами» массивов могут потребовать введения переменных для хранения промежуточных результатов. В таких случаях вам предоставляется лишний повод подумать о реализации проекта на более мощном языке программирования, например Perl или C.
Пример 25-10. Исследование математических последовательностей
Bash поддерживает только одномерные массивы, но, путем небольших ухищрений, можно эмулировать многомерные массивы.
Пример 25-11. Эмуляция массива с двумя измерениями
По существу, двумерный массив эквивалентен одномерному, с тем лишь различием, что для индексации отдельных элементов используются два индекса — «строка» и «столбец» .
Более сложный пример эмуляции двумерного массива вы найдете в Пример A-11.
Источник
Массивы Bash
Невозможно представить себе язык программирования, который не поддерживал бы массивов. Под массивами обычно подразумеваются упорядоченные списки строк, символов или любых других объектов. Неважно как они реализованы в большинстве языков программирования, они помогают лучше управлять данными.
Язык сценариев Bash тоже имеет свои возможности работы с массивами. В этой статье мы рассмотрим как работают массивы Bash, как их создавать и использовать. В некоторых случаях это очень удобно.
Массивы Bash
Массивы оболочки Bash работают почти так же, как и в других языках программирования. Перед тем как вы сможете использовать массив, его нужно объявить. Это можно сделать несколькими способами, первый из них — это использование команды оболочки declare:
declare -a имя_массива
Но необязательно делать именно так, вы можете сразу начать задавать элементы массива по нужным номерам:
имя_массива[ XX ] = значение
Здесь XX обозначает индекс массива. Еще один удобный способ создавать массивы строк Bash — это просто перечислить все элементы в круглых скобках:
имя_массива=( э лемент_1, элемент_2 элемент_3 . )
Или вы можете сразу задать индекс массива для каждого из элементов:
имя_массива=( [ XX ]= значение [ XX ]= значение . . . )
Также можно прочитать значения для массива из клавиатуры или другого источника ввода:
read -a имя_массива
При вводе элементов массива они должны быть разделены символом пробела. Для получения значений элементов массива используйте синтаксис фигурных скобок, обратите внимание, что нумерация элементов массива, как и в большинстве языков начинается с нуля:
Это все основные моменты, которые будут вам полезны при использовании массивов, теперь нам осталось рассмотреть основные примеры, чтобы вам было более понятно как все это работает.
Примеры использования массивов Bash
Теперь рассмотрим примеры массивов bash. Сначала нам нужно создать массив, который мы будем использовать для примеров, на мой взгляд будет проще использовать синтаксис с круглыми скобками. Вообще, массивы используются в скриптах, но мы будем их применять прямо в оболочке Bash. Для начала так будет проще. Создаем массив:
array=(первый второй третий четвертый пятый)
Теперь попытаемся вывести один из элементов массива по его индексу:
Чаще всего используются массивы строк Bash, но иногда могут встречаться и цифры. Помните про нумерацию? Индексы элементов массива начинаются с нуля. Для вывода значения элемента по индексу можно использовать и немного другой синтаксис:
Вы можете вывести все элементы:
Все элементы, начиная с номера 1:
Вывести все элементы которые находятся в диапазоне от 1 до 4:
Чтобы узнать длину первого элемента выполните:
А посмотреть количество элементов массива Bash можно таким же синтаксисом:
Кроме всего прочего, вы можете заменить одни символы в определенном элементе массива или во всем массиве на другие. Для этого используйте:
В некоторых случаях, для перебора элементов массива очень удобно использовать циклы. На этот раз сделаем небольшой скрипт:
array=(первый второй третий четвертый пятый)
for i in $
do
echo $i
done
Внутри цикла вы можете делать со значением элемента все, что вам нужно. Как я уже писал выше, вы можете прочитать значения для массива с помощью функции read:
echo «Введите элементы массива:»
read -a array
echo «Результат:»
for i in $
do
echo $i
done
Как и в любом другом варианте, вам нужно, чтобы все элементы были разделены пробелом. Точно так же можно присвоить массиву результат выполнения команды. Например, сохраним список файлов, полученный от ls:
Усложним задачу и сделаем скрипт, который будет выводить все файлы из указанной директории, которые имеют права доступа 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 $
echo $
fi
done
Теперь проверим наш скрипт на папке /bin. Но перед этим нужно дать ему права на выполнение:
chmod u+x ./lsperm.sh
$ ./lsperm.sh
Как видите, все работает. Кроме номеров, в качестве индексов для массивов можно использовать строки. Такие массивы Bash называются ассоциативными и поддерживаются они начиная с четвертной версии Bash. Для создания ассоциативного массива используется declare с опцией -A:
declare -A assoc_array
Несмотря на то что Bash поддерживает только одномерные массивы, мы можем выполнять симуляцию работы с многомерными матрицами с помощью ассоциативных массивов:
declare -A matrix
Чтобы удалить массив, созданный с помощью declare используйте функцию unset:
Выводы
В этой статье мы рассмотрели как работают массивы Bash в Linux, как их создавать, а также как использовать. Если разобраться, то здесь нет ничего очень сложного, а массивы могут стать очень важным элементов ваших скриптов.
Источник