Индексированный массив Bash, объясненный примерами
Массивы – это тип структуры данных, используемый для хранения значений определенного типа. Вы также можете рассматривать массив как переменную, но переменная может хранить только одно значение, тогда как массив может хранить в себе несколько значений. Концепция массива связана не только с bash. Любой язык программирования, с которым вы работаете, будет содержать массивы, но с различиями в реализации.
Bash поддерживает два типа массивов:
- Индексированный массив
- Ассоциативный массив
Индексированные массивы – это тип массива, в котором элементы (значения) хранятся и им присваиваются целые числа от 0 до N. На элементы внутри массива ссылаются с помощью индексного номера. Подробнее об этом вы узнаете в следующей статье. Основное внимание в этой статье уделяется только индексированным массивам.
Как инициализировать индексированный массив в Bash
Первым шагом на пути к работе с массивом является его создание. Термин создать, определить, инициализировать массив будет использоваться как взаимозаменяемый, но указывает на одно и то же значение – создание массива.
Чтобы создать массив, следует использовать скобки и помещать элементы массива (значения) внутри скобок.
arr1=( one 2 three 4 )
Важные моменты, на которые следует обратить внимание:
- Массивы Bash могут хранить элементы другого типа данных. В некоторых языках программирования вы можете хранить значения только в массиве одного и того же типа.
- Ограничений на количество элементов, которые можно хранить в массиве, нет. Это зависит от наличия системной памяти.
Вы также можете использовать команду declare
с флагом -a
для создания индексированного массива.
declare -a arr1
arr1=( one 2 three 4 )
Или,
declare -a arr1=( one 2 three 4 )
Как добавить или просмотреть элементы массива
Вы можете либо создать массив со значениями в нем, как показано в предыдущем разделе, либо просто создать пустой массив и добавить значения позже. Ниже показано, как создать пустой массив.
locations=()
Каждому элементу массива соответствует значение индекса от 0 до N. Вам необходимо добавлять новые элементы в массив, используя позицию индекса.
locations[0]="Chennai"
locations[1]="Mumbai"
Вот графическая иллюстрация добавления элементов в массив.
Графическое представление — добавление элемента в массив
Чтобы просмотреть элементы массива, вы можете использовать любой из следующих синтаксисов.
echo ${locations[@]}
echo ${locations[*]}
Инициализировать и распечатать массив
Чтобы узнать разницу между @ и * и как она работает с массивом, обратитесь к разделу «Цикл по элементам массива» в нашем руководстве по Bash For Loop.
Если вы попытаетесь вывести список элементов массива без использования @
или *
, будет напечатан только первый элемент массива.
echo ${locations}
Массив без операторов * или @
Вы можете получить доступ к конкретному элементу напрямую, используя его индексную позицию.
echo ${locations[1]}
Распечатать массив в определенной позиции индекса
Индексное значение массива
В предыдущем разделе я показал, как добавлять элементы в массив, используя позицию индекса. Когда вы добавляете массивы, используя индексные позиции, вы можете пропускать и добавлять элементы в разные индексные позиции.
В позициях массива есть два элемента в позициях 0 и 1. Теперь я могу пропустить индекс 2 и добавить его к различным позициям индекса.
locations[5]="Delhi"
Добавить новый элемент
На изображении выше вы можете видеть, что я добавил новый элемент в массив с индексом 5.
Графическое представление — добавление нового элемента в массив.
Если вы хотите напечатать значения индексов элементов, добавьте к массиву префикс символа "!"
, как показано ниже:
echo ${!locations[@]}
Это будет печатать только значения индекса вместо печати элементов.
Распечатать индексную позицию
Чтобы напечатать индекс и элементы, используйте следующий фрагмент.
for val in ${!locations[@]}
do
echo "index = ${val} , value = ${locations[$val]}"
done
Распечатать индекс и элементы
Добавить значения в массив
Вы можете добавлять новые элементы в массив, не используя значения их индексов, и это приведет к добавлению элементов в массив.
locations=( Chennai Mumbai Delhi )
locations+=( Bangalore )
locations+=( Hyderabad )
echo ${locations[@]}
echo ${!locations[@]}
Добавить элементы в массив
Найти длину массива
Вы можете узнать, сколько элементов содержится в массиве, добавив перед массивом символ #
.
echo ${#locations[@]}
Длина массива
Используя тот же символ #
, вы также можете узнать, пуст массив или нет.
if [[ ${#locations[@]} -ne 0 ]]; then
echo "Array is Not empty"
else
echo "Array is Empty"
fi
Узнать, пуст ли массив или нет
Удалить элементы из массива
Чтобы удалить элемент из массива, вы можете использовать команду unset
. Взгляните на приведенный ниже пример, где с помощью команды unset
удаляется элемент из index(2)
.
echo ${locations[@]}
unset locations[2]
echo ${locations[@]}
Удалить элементы из массива
Удалить массив
Чтобы удалить массив, вы можете использовать ту же команду unset
.
unset locations
echo ${locations[@]}
Удалить массив
Очистить массив
Иногда вам может потребоваться удалить все элементы из массива и оставить массив пустым. В этом случае вы можете просто воссоздать массив.
echo ${locations[@]}
Chennai Mumbai Delhi Hyderabad Bangalore
locations=()
echo ${locations[@]}
Сделать массив пустым
Сохранить вывод команды в виде массива
Вы можете запускать любые команды и пытаться сохранить результат в массиве. Команда должна быть заключена в скобки, чтобы выходные данные сохранялись в виде массива.
path_list=( $(echo $PATH | tr ":" "\n") )
echo ${path_list[@]}
Сохранить вывод команды в виде массива
Нарезка массива
Срезирование дает вам возможность извлекать определенные элементы массива на основе их индексной позиции.
Ниже приведен синтаксис для нарезки:
${locations[@]:index:length}
Если вы хотите получить все элементы, кроме определенной начальной позиции индекса, вы можете сделать это следующим образом, используя только индекс.
echo ${locations[@]:index} # syntax
echo ${locations[@]:2}
Нарезка — позиция индекса
В приведенном выше примере массив будет напечатан, начиная с позиции индекса 2 и до последнего элемента. Если вы укажете длину вместе с индексом, для разрезания массива будет использоваться следующая формула.
From index to index+length-1 (inclusive) # Formula
echo ${locations[@]:1:3}
Нарезка — индекс и длина
Если вы пропустите индекс и укажете только длину, он будет нарезан по следующей формуле.
From Index 0 to length-1 (inclusive)
echo ${locations[@]::4}
Нарезка — только длина
Заключение
В этой статье я познакомил вас с индексированным массивом bash. Массивы очень важны, когда вы начинаете писать сложные сценарии Bash. Они дают вам возможность легко хранить, извлекать и манипулировать данными различного типа. В отличие от языков программирования, таких как Python, не существует встроенных способов легкого использования массивов для выполнения некоторых сложных задач, но все же достижимых.
В нашем следующем руководстве мы подробно обсудим Ассоциативный массив.
- Скрипты Bash: объяснение ассоциативных массивов на примерах
Связанное чтение:
- Скрипты Bash: циклы while и Until с примерами
- Скрипты Bash: функции, поясняемые примерами
- Скрипты Bash: переменные, поясняемые примерами
- Перенаправление Bash, объясненное примерами
- Команда Bash Echo с примерами для Linux
- Руководство по Bash Heredoc для начинающих