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

Gau*_* KS 92 bash array shell-script

我有一个包含一些元素的数组,但我想将新项目推送到数组的开头;我怎么做?

αғs*_*нιη 119

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

arr=("new_element" "${arr[@]}")
Run Code Online (Sandbox Code Playgroud)

一般来说,你会这样做。

arr=("new_element1" "new_element2" "..." "new_elementN" "${arr[@]}")
Run Code Online (Sandbox Code Playgroud)

要将元素添加到数组的末尾,请使用。

arr=( "${arr[@]}" "new_element" )
Run Code Online (Sandbox Code Playgroud)

或者相反

arr+=( "new_element" )
Run Code Online (Sandbox Code Playgroud)

一般来说,你会这样做。

arr=( "${arr[@]}" "new_element1" "new_element2" "..." "new_elementN") #Or
arr+=( "new_element1" "new_element2" "..." "new_elementN" )
Run Code Online (Sandbox Code Playgroud)

要将元素添加到数组的特定索引,请使用。

假设我们想在 Index2 arr[2]的位置添加一个元素,我们实际上会在下面的子数组上进行合并:

  1. 获取索引 position2 arr[0]arr[1]之前的所有元素;
  2. 向数组中添加一个元素;
  3. 获取所有索引为 position2 的元素到最后一个arr[2] , arr[3] , ....

    arr=( "${arr[@]:0:2}" "new_element" "${arr[@]:2}" )
    
    Run Code Online (Sandbox Code Playgroud)

从数组中删除一个元素

除了从数组中删除一个元素(假设是元素 #3),我们还需要连接两个子数组。第一个子数组将保存元素#3 之前的元素,第二个子数组将包含元素#3 之后的元素。

arr=( "${arr[@]:0:2}" "${arr[@]:3}" )
Run Code Online (Sandbox Code Playgroud)
  • ${arr[@]:0:2}将获得两个元素arr[0]arr[1]从数组的开头开始。
  • ${arr[@]:3}将获取从 index3 arr[3] 到最后一个的所有元素。

    一种可能的方便的方法来重新构建 arr 排除 element#3 (arr[2]) 从中:

    del_element=3; arr=( "${arr[@]:0:$((del_element-1))}" "${arr[@]:$del_element}" )
    
    Run Code Online (Sandbox Code Playgroud)

    指定要在 中排除的元素del_element=

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

  1. 使用unset(实际上为元素分配“空”值)

    unset -v 'arr[2]'
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果您知道数组元素的值以截断它们的值(用空字符串替换),请使用替换模式。

    arr=( "${arr[@]/PATTERN/}" )
    
    Run Code Online (Sandbox Code Playgroud)

打印数组

printf '%s\n' "${arr[@]}"
Run Code Online (Sandbox Code Playgroud)


Sté*_*las 5

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

a=(newvalue "$a[@]")
Run Code Online (Sandbox Code Playgroud)

$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")
Run Code Online (Sandbox Code Playgroud)

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

如果你想插入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
Run Code Online (Sandbox Code Playgroud)

类似zshyash具有普通数组的外壳具有用于该操作的运算符:

  • “bash 中的数组(从 ksh 复制)是相当关联的数组”??我认为 bash 中有“常规”(可能是稀疏的)和关联(您可以使用字符串作为 indecies)数组,我错过了什么? (3认同)