Bash-скрипты — массив

Опубликовано: 30 Сентября, 2022

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

Создание массивов

Чтобы создать базовый массив в сценарии bash, мы можем использовать команду declare -a , за которой следует имя переменной массива, которую вы хотите указать.

#!/bin/usr/env bash

declare -a sport=(
[0]=football
[1]=cricket
[2]=hockey
[3]=basketball
)

ИЛИ ЖЕ

#!/bin/usr/env bash

sport[0]=football
sport[1]=cricket
sport[2]=hockey
sport[3]=basketball

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

Печать массивов

После объявления массива, если мы хотим отобразить все элементы массива, мы можем использовать символ @.

#!/bin/usr/env bash

declare -a sport=(
[0]=football
[1]=cricket
[2]=hockey
[3]=basketball
)

echo "${sport[@]}"

echo "${array_name[@]}"  

Мы используем [@] в качестве индекса массива для отображения всех элементов. Все элементы печатаются через пробел. Кавычки вокруг переменной расширяются и печатают все элементы массива.

Итерация по массиву

Чтобы перебирать массив по одному элементу за раз, мы можем использовать циклы и выполнять любые операции в его теле.

#!/bin/usr/env bash

declare -a sport=(
[0]=football
[1]=cricket
[2]=hockey
[3]=basketball
)

for i in ${nums[@]}
do
echo -e "$i 
"
done

Как мы видим, мы использовали цикл for для вывода элементов из массива один за другим. Мы использовали трюк из предыдущего раздела, чтобы получить все элементы массива и выполнить итерацию по ним один за другим в цикле for. «${array_name[@]}» расширяется во все элементы в массиве, и цикл for выполняет итерацию по ним один за другим с помощью итератора, в примере это переменная i , внутри тела цикла for мы печатаем переменная/итератор i и, таким образом, перебирать массив.

Получить количество элементов в массиве

Чтобы получить количество элементов массива, мы можем использовать оператор # перед именем массива в s в «${array_name[@]}».

 #!/bin/usr/env bash

declare -a sport=(
[0]=football
[1]=cricket
[2]=hockey
[3]=basketball
)

echo "${#sport[@]}"

Таким образом, мы возвращаем размер массива с помощью команды «${#sport[@]}», # используется для получения размера переменной рядом с ним, с помощью двойных кавычек оценивается значение команды и мы получаем количество элементов в массиве по желанию.

Вставка элемента в массив

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

#!/bin/usr/env bash

declare -a sport=(
[0]=football
[1]=cricket
[2]=hockey
[3]=basketball
)

echo "${sport[@]}"

sport[4]="dodgeball"
sport[2]="golf"

echo "${sport[@]}"

Мы добавили 5-й элемент (4-й индекс) в массив, а также изменили/отредактировали 3-й элемент массива (2-й индекс). Имя_массива[индекс]=значение — это все приемы добавления, изменения или инициализации элементов массива.

Мы также можем добавлять элементы в массив с помощью оператора +=.

#!/bin/usr/env bash

declare -a sport=(
[0]=football
[1]=cricket
[2]=hockey
[3]=basketball
)

echo "${sport[@]}"
sport+=("golf" "baseball")
echo "${sport[@]}"
echo "Size : ${#sport[@]}"

Как видно из примера, мы можем добавить несколько элементов в массив с минимальным кодом. Мы используем array_name+=(elements) для добавления элементов в массив.

Удаление элемента из массива

Чтобы удалить элемент из массива, мы можем использовать команду unset. Команда принимает имя переменной, в нашем случае имя массива и индекс этого элемента. Индекс также может быть относительным, т.е. -1 указывает на последний элемент и -2 на предпоследний элемент и так далее.

#!/bin/usr/env bash

declare -a sport=(
[0]=football
[1]=cricket
[2]=hockey
[3]=basketball
)

unset sport[1]
echo "${sport[@]}" 
echo "${#sport[@]}" 

Как мы видим, unset имя_массива[индекс] удалит элемент с индексом из массива. Кроме того, размер массива был уменьшен с 4 до 3, что указывает на то, что элемент полностью удален, а не просто заменен пробелом.

Использование относительных индексов

Если мы используем такие индексы, как -1, -2 и т. д., ссылки на элементы начинаются с последнего элемента, и, следовательно, мы можем удалять или изменять их с относительным порядком также и с конца.

#!/bin/usr/env bash

declare -a sport=(
[0]=football
[1]=cricket
[2]=hockey
[3]=basketball
)

unset sport[-3]
echo "${sport[@]}"

Как мы видим, индекс 1 также упоминается как -3 сзади, и, следовательно, становится относительно проще ссылаться на определенные элементы в большом массиве.

Объединение массива

Мы можем соединить (вынуть зелье) массив, чтобы назначить или напечатать его в другую переменную/массив.

#!/bin/usr/env bash

declare -a sport

sport+=("football" "cricket" "hockey" "basketball")
sport+=("golf" "baseball")

echo "sport = ${sport[@]}"
arr="${sport[@]:1:3}"
echo "arr = ${arr[@]}"

Мы взяли кусок из спортивного массива, то есть элемент между индексами 1 и 3 включительно, и присвоили его переменной arr, которая также является массивом. Оператор @ получает все элементы из массива, а затем мы можем объединить массив между индексами 1 и 3, чтобы у нас были элементы с номерами 1, 2 и 3 (крикет, хоккей и бейсбол) из массива спорта.

Определите статический массив и распечатайте элементы массива

#To declare static Array
programmingArray=(Java Python Ruby Perl)

#In below 2 ways we can print the elements of the static array
echo "Way 1 of printing static values by using <array>[@]:0 - " ${programmingarray[@]$
echo "Way 2 of printing static values by using <array>[*]:0 - " ${programmingarray[*]$

Выполнение программы

sh <filename>

So, we can give as

sh arraycheck2.sh # arraycheck2.sh is the name of the script file here

Передача аргументов командной строки в файл скрипта

#All the array elements are stored in an array called programmingArray
programmingArray=("$@")
#Index values start from 0

#If we do not specify the index, it will take up the size of first index value
echo "Size of programmingArray at 0th location..:" $(#programmingArray[0]}

echo "Size of programmingArray at 1st location..:" $(#programmingArray[1]}

Приведенный выше скрипт может быть выполнен как

# Здесь Java, Python и Ruby являются аргументами командной строки

sh arrayCheck.sh  Java Python Ruby  

Этапы выполнения скрипта:

ProgrammingArray=(Java Python Ruby)

#Java будет присутствовать в 0-м индексе, его размер можно вычислить следующим образом

${#programmingArray[0]}

Точно так же Python будет присутствовать в 1-м индексе, его размер можно вычислить следующим образом.

${#programmingArray[1]}

Выход:

Перебор значений массива с использованием цикла for

$@ предоставит все значения, переданные через аргументы командной строки, и они будут сохранены в массиве.

Его можно повторять с помощью цикла for.

declare -a programmingArray=("$@")

i=0

for programming in "$@"

do

  echo "Array value at index " $i " : " $programming

  i=$((i+1));

done 

Выход:

Давайте кратко рассмотрим, что представляет собой каждый символ.

Синтаксис

Выход
приб=()

arr[0]=3 Перезаписать 1-й элемент

arr+=(4) Добавить значение(я)

str=$(ls) Сохранить вывод ls как строку

arr=( $(ls) ) Сохранить вывод ls как массив файлов

${arr[@]:s:n} Получить n элементов, начиная с индекса

#Мы можем предоставить набор значений

как это

arr=(один два три)

Чтобы инициализировать массив
${обр[0]} Чтобы получить первый элемент. Всегда индекс начинается с 0
${пример[@]} Чтобы получить все элементы, после чего мы можем выполнить итерацию в цикле
${!арр[@]} Чтобы получить только индексы массива
${#обр[@]} Чтобы вычислить размер массива
обр[2]=3 Чтобы перезаписать 3-й элемент, нам нужно использовать его таким образом. Поскольку индекс начинается с 0, arr[2] правильный.
обр+=(40) Чтобы добавить значение (я), мы можем использовать +, а затем присвоить с помощью = и, следовательно, используется +=.
ул=$(лс) Чтобы сохранить вывод команды «ls» в виде строки (пример 4 показан для этого вывода)
приб=($(лс)) Чтобы сохранить вывод «ls» в виде массива файлов (пример 5 показан для этого вывода)
${прибл.[@]:s:n} Чтобы получить «n» элементов, начиная с индекса «s»