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

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

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

答案1

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

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 的位置添加一个元素到达[2],我们实际上会合并以下子数组:

  1. 获取Indexposition2之前的所有元素到达[0]到达[1]
  2. 向数组添加一个元素;
  3. 获取索引位置2到最后的所有元素到达[2],到达[3], ....

    arr=( "${arr[@]:0:2}" "new_element" "${arr[@]:2}" )
    

从数组中删除一个元素

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

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

    一种可能的便捷方法是重建 arr,排除 element#3 (arr[2]):

    del_element=3; arr=( "${arr[@]:0:$((del_element-1))}" "${arr[@]:$del_element}" )
    

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

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

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

    unset -v 'arr[2]'
    
  2. 如果您知道数组元素的值,请使用替换模式来截断其值(用空字符串替换)。

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

打印数组

printf '%s\n' "${arr[@]}"

答案2

请注意,(从 ksh 复制)中的数组bash是相当关联的数组(键仅限于正整数,也称为稀疏数组)。

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

将使用as创建一个新$a数组,并将原始数组的元素按其键的数字顺序附加到键 1, 2...newvalue${a[0]}

例如,如果您有:

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

zsh像或那样具有普通数组的shellyash有相应的运算符:

  • zsh

      a[1,0]=newvalue
    

(也适用于将字符串添加到标量变量之前)

  • yash

      array -i a 0 newvalue
    

答案3

# 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  
}

答案4

创建索引数组:

$ declare -a A
$ declare -p A

声明-a A

向数组添加一些元素:

$ A+=(foo)
$ A+=(bar)
$ A+=("baz quux")
$ declare -p A

声明 -a A=([0]="foo" [1]="bar" [2]="baz quux")

删除中间元素,使其成为稀疏索引数组:

$ unset A[1]
$ declare -p A

声明 -a A=([0]="foo" [2]="baz quux")

从稀疏索引数组中删除最后一个元素:

$ unset A[-1]
$ declare -p A

声明 -a A=([0]="foo")

相关内容