У меня есть массив, содержащий некоторые элементы, но я хочу поместить новые элементы в начало массива; Как я могу это сделать?
У меня есть массив, содержащий некоторые элементы, но я хочу поместить новые элементы в начало массива; Как я могу это сделать?
Ответы:
arr=("new_element" "${arr[@]}")
Как правило, вы бы сделали.
arr=("new_element1" "new_element2" "..." "new_elementN" "${arr[@]}")
arr=( "${arr[@]}" "new_element" )
Или вместо
arr+=( "new_element" )
Как правило, вы бы сделали.
arr=( "${arr[@]}" "new_element1" "new_element2" "..." "new_elementN") #Or
arr+=( "new_element1" "new_element2" "..." "new_elementN" )
Допустим, мы хотим добавить элемент в позицию Index2 arr [2] , мы бы фактически слились с нижними подмассивами:
Получить все элементы с индексом position2 до последнего arr [2] , arr [3] , ....
arr=( "${arr[@]:0:2}" "new_element" "${arr[@]:2}" )
В дополнение к удалению элемента из массива (скажем, элемента № 2) нам нужно объединить два подмассива. Первый вложенный массив будет содержать элементы перед элементом # 2, а второй вложенный массив будет содержать элементы после элемента # 2.
arr=( "${arr[@]:0:2}" "${arr[@]:3}" )
${arr[@]:0:2}
получит два элемента arr [0] и arr [1] начинается с начала массива.${arr[@]:3}
получит все элементы от index3 arr [3] до последнего.Другая возможность удалить элемент
Использование unset
(фактически присваивает элементу значение 'null')
unset arr[2]
Используйте шаблон замены, если вы знаете ценность своих элементов.
arr=( "${arr[@]/PATTERN/}" )
arr+=(element)
и unset arr[2]
(что должно быть unset -v 'arr[2]'
!), Предполагается использование не разреженных массивов. Также обратите внимание, что arr=( "${arr[@]/PATTERN/}" )
количество элементов не изменяется. Все, что он может сделать, это заменить их пустой строкой.
Обратите внимание, что массивы в bash
(скопированные из ksh) являются довольно ассоциативными массивами.
a=(newvalue "$a[@]")
создаст новый $a
массив с newvalue
as ${a[0]}
и элементами исходного массива, добавленными в порядке их ключей с ключами 1, 2 ...
Например, если у вас было:
bash-4.4$ typeset -p a
declare -a a=([0]="foo" [12]="bar")
bash-4.4$ a=(newvalue "${a[@]}")
bash-4.4$ typeset -p a
declare -a a=([0]="newvalue" [1]="foo" [2]="bar")
Это объясняет, почему для этого нет встроенного оператора.
Если вы хотите вставить newvalue
as ${a[0]}
и сдвинуть все остальные ключи на один, вам понадобится временный массив:
b=newvalue
for k in "${!a[@]}"; do
b[k+1]=${a[k]}
done
unset a
for k in "${!b[@]}"; do
a[k]=${b[k]}
done
unset b
Оболочки типа zsh
или yash
с обычными массивами имеют операторы для этого:
zsh
:
a[1,0]=newvalue
(также работает для добавления строк в скалярные переменные)
yash
:
array -i a 0 newvalue
# array declaration
arr=()
#Function to read data from file a and add into array
fun_add_in_array()
{
input=$1
while IFS=',' read -r f1 f2
do
echo "Element1 : $f1"
echo "Element2 : $f2"
arr+=( "$f1" )
done < "$input"
}
#Function to print a array
fun_read_array()
{
arr=("$@")
for i in "${arr[@]}"
do
echo $i
done
}
ARRAY+=('foo')