如何在bash中的数组中添加元素或从中删除元素?


Answers:


48

要将元素添加到数组的开头,请使用。

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]的位置添加一个元素,实际上我们将在以下子数组上进行合并:

  1. 获取索引position2 arr [0]arr [1]之前的所有元素;
  2. 向数组添加元素;
  3. 获取索引位置为2到最后一个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] 到最后的所有元素。

删除元素的另一种可能性是

  1. 使用unset(实际上将“ null”值分配给元素)

    unset arr[2]
  2. 如果您知道元素的值,请使用替换模式。

    arr=( "${arr[@]/PATTERN/}" )

2
请注意,除了arr+=(element)unset arr[2](应为unset -v 'arr[2]'!)外,它假定为非稀疏数组。另请注意,arr=( "${arr[@]/PATTERN/}" )不会更改元素的数量。它所能做的就是用空字符串替换它们。
斯特凡Chazelas

因此,为了使删除部分起作用,您必须找到索引,对吗?找到它的最快方法是什么?
qodeninja

3

请注意,bash(从ksh复制)中的数组是关联数组。

a=(newvalue "$a[@]")

会创建一个$a具有newvalueas 的新数组,${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")

这就解释了为什么没有内置的运算符。

如果要插入newvalueas ${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

诸如此类zshyash具有普通数组的外壳具有用于此的运算符:

  • zsh

    a[1,0]=newvalue

    (也适用于将字符串放在标量变量之前)

  • yash

    array -i a 0 newvalue

1
“ bash中的数组(从ksh复制)是关联数组”?我以为bash中有“常规”(可能是稀疏的)和关联(您可以在其中使用字符串作为索引)数组,我缺少什么?
nhed

0
# 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  
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.