Поиск…
Назначение массива
Назначение списка
Если вы знакомы с Perl, C или Java, вы можете подумать, что Bash будет использовать запятые для разделения элементов массива, однако это не так; вместо этого Bash использует пробелы:
# Array in Perl
my @array = (1, 2, 3, 4);
# Array in Bash
array=(1 2 3 4)
Создайте массив с новыми элементами:
array=('first element' 'second element' 'third element')
Назначение подзаголовка
Создайте массив с явными индексами элементов:
array=([3]='fourth element' [4]='fifth element')
Назначение по индексу
array[0]='first element'
array[1]='second element'
Назначение по имени (ассоциативный массив)
declare -A array
array[first]='First element'
array[second]='Second element'
Динамическое присвоение
Создайте массив из вывода другой команды, например, используйте seq, чтобы получить диапазон от 1 до 10:
array=(`seq 1 10`)
Назначение входных аргументов скрипта:
array=("$@")
Назначение в циклах:
while read -r; do
#array+=("$REPLY") # Array append
array[$i]="$REPLY" # Assignment by index
let i++ # Increment index
done < <(seq 1 10) # command substitution
echo ${array[@]} # output: 1 2 3 4 5 6 7 8 9 10
где $REPLY
всегда является текущим
Доступ к элементам массива
Элемент печати с индексом 0
echo "${array[0]}"
Печать последнего элемента с использованием синтаксиса расширения подстроки
echo "${arr[@]: -1 }"
Печать последнего элемента с использованием синтаксиса подстроки
echo "${array[-1]}"
Распечатайте все элементы, каждый из которых указан отдельно
echo "${array[@]}"
Печать всех элементов в виде одной строки с кавычками
echo "${array[*]}"
Распечатайте все элементы из индекса 1, каждый из которых указан отдельно
echo "${array[@]:1}"
Распечатайте 3 элемента из индекса 1, каждый из которых указан отдельно
echo "${array[@]:1:3}"
Строковые операции
Если обратиться к одному элементу, разрешены строковые операции:
array=(zero one two)
echo "${array[0]:0:3}" # gives out zer (chars at position 0, 1 and 2 in the string zero)
echo "${array[0]:1:3}" # gives out ero (chars at position 1, 2 and 3 in the string zero)
поэтому ${array[$i]:N:M}
выдает строку из N
й позиции (начиная с 0) в строке ${array[$i]}
с M
следующими символами.
Длина массива
${#array[@]}
дает длину массива ${array[@]}
:
array=('first element' 'second element' 'third element')
echo "${#array[@]}" # gives out a length of 3
Это также работает со строками в отдельных элементах:
echo "${#array[0]}" # gives out the lenght of the string at element 0: 13
Модификация массива
Изменить индекс
Инициализировать или обновить определенный элемент в массиве
array[10]="elevenths element" # because it's starting with 0
присоединять
Измените массив, добавив элементы в конец, если индекс не указан.
array+=('fourth element' 'fifth element')
Замените весь массив новым списком параметров.
array=("${array[@]}" "fourth element" "fifth element")
Добавьте элемент в начале:
array=("new element" "${array[@]}")
Вставить
Вставьте элемент с заданным индексом:
arr=(a b c d)
# insert an element at index 2
i=2
arr=("${arr[@]:0:$i}" 'new' "${arr[@]:$i}")
echo "${arr[2]}" #output: new
удалять
Удалите индексы массива с помощью unset
builtin:
arr=(a b c)
echo "${arr[@]}" # outputs: a b c
echo "${!arr[@]}" # outputs: 0 1 2
unset -v 'arr[1]'
echo "${arr[@]}" # outputs: a c
echo "${!arr[@]}" # outputs: 0 2
сливаться
array3=("${array1[@]}" "${array2[@]}")
Это работает и для разреженных массивов.
Повторная индексация массива
Это может быть полезно, если элементы были удалены из массива или если вы не уверены в наличии пробелов в массиве. Чтобы воссоздать индексы без пробелов:
array=("${array[@]}")
Итерация массива
Итерация массива поставляется в двух вариантах: foreach и classic for-loop:
a=(1 2 3 4)
# foreach loop
for y in "${a[@]}"; do
# act on $y
echo "$y"
done
# classic for-loop
for ((idx=0; idx < ${#a[@]}; ++idx)); do
# act on ${a[$idx]}
echo "${a[$idx]}"
done
Вы также можете перебирать вывод команды:
a=($(tr ',' ' ' <<<"a,b,c,d")) # tr can transform one character to another
for y in "${a[@]}"; do
echo "$y"
done
Уничтожить, удалить или удалить массив
Чтобы уничтожить, удалить или удалить массив:
unset array
Чтобы уничтожить, удалить или удалить один элемент массива:
unset array[10]
Ассоциативные массивы
Объявить ассоциативный массив
declare -A aa
Объявление ассоциативного массива перед инициализацией или использованием является обязательным.
Инициализация элементов
Вы можете инициализировать элементы по одному в следующем порядке:
aa[hello]=world
aa[ab]=cd
aa["key with space"]="hello world"
Вы также можете инициализировать весь ассоциативный массив в одном выражении:
aa=([hello]=world [ab]=cd ["key with space"]="hello world")
Доступ к элементу ассоциативного массива
echo ${aa[hello]}
# Out: world
Список ассоциативных ключей массива
echo "${!aa[@]}"
#Out: hello ab key with space
Отображение значений ассоциативного массива
echo "${aa[@]}"
#Out: world cd hello world
Итерация по ключам ассоциативных массивов и значениям
for key in "${!aa[@]}"; do
echo "Key: ${key}"
echo "Value: ${array[$key]}"
done
# Out:
# Key: hello
# Value: world
# Key: ab
# Value: cd
# Key: key with space
# Value: hello world
Элементы ассоциативного массива графа
echo "${#aa[@]}"
# Out: 3
Список инициализированных индексов
Получить список индексированных индексов в массиве
$ arr[2]='second'
$ arr[10]='tenth'
$ arr[25]='twenty five'
$ echo ${!arr[@]}
2 10 25
Цитирование через массив
Наш массив примеров:
arr=(a b c d e f)
Использование цикла for..in
:
for i in "${arr[@]}"; do
echo "$i"
done
Использование C-стиля for
цикла:
for ((i=0;i<${#arr[@]};i++)); do
echo "${arr[$i]}"
done
Использование во while
цикла:
i=0
while [ $i -lt ${#arr[@]} ]; do
echo "${arr[$i]}"
i=$((i + 1))
done
Использование во while
цикла с числовым условно:
i=0
while (( $i < ${#arr[@]} )); do
echo "${arr[$i]}"
((i++))
done
Не спользование until
цикла:
i=0
until [ $i -ge ${#arr[@]} ]; do
echo "${arr[$i]}"
i=$((i + 1))
done
Не спользование until
контура с числовым условным:
i=0
until (( $i >= ${#arr[@]} )); do
echo "${arr[$i]}"
((i++))
done
Массив из строки
stringVar="Apple Orange Banana Mango"
arrayVar=(${stringVar// / })
Каждое пространство в строке обозначает новый элемент в результирующем массиве.
echo ${arrayVar[0]} # will print Apple
echo ${arrayVar[3]} # will print Mango
Аналогично, для разделителя могут использоваться другие символы.
stringVar="Apple+Orange+Banana+Mango"
arrayVar=(${stringVar//+/ })
echo ${arrayVar[0]} # will print Apple
echo ${arrayVar[2]} # will print Banana
Функция вставки массива
Эта функция будет вставлять элемент в массив по заданному индексу:
insert(){
h='
################## insert ########################
# Usage:
# insert arr_name index element
#
# Parameters:
# arr_name : Name of the array variable
# index : Index to insert at
# element : Element to insert
##################################################
'
[[ $1 = -h ]] && { echo "$h" >/dev/stderr; return 1; }
declare -n __arr__=$1 # reference to the array variable
i=$2 # index to insert at
el="$3" # element to insert
# handle errors
[[ ! "$i" =~ ^[0-9]+$ ]] && { echo "E: insert: index must be a valid integer" >/dev/stderr; return 1; }
(( $1 < 0 )) && { echo "E: insert: index can not be negative" >/dev/stderr; return 1; }
# Now insert $el at $i
__arr__=("${__arr__[@]:0:$i}" "$el" "${__arr__[@]:$i}")
}
Использование:
insert array_variable_name index element
Пример:
arr=(a b c d)
echo "${arr[2]}" # output: c
# Now call the insert function and pass the array variable name,
# index to insert at
# and the element to insert
insert arr 2 'New Element'
# 'New Element' was inserted at index 2 in arr, now print them
echo "${arr[2]}" # output: New Element
echo "${arr[3]}" # output: c
Чтение всего файла в массив
Чтение за один шаг:
IFS=$'\n' read -r -a arr < file
Чтение в цикле:
arr=()
while IFS= read -r line; do
arr+=("$line")
done
Использование mapfile
или readarray
(которые являются синонимами):
mapfile -t arr < file
readarray -t arr < file