如何删除数组索引中的"漏洞"?

Sop*_*rez 0 arrays bash

对不起,但我不知道拼写这个的正确方法.我希望这个例子可以解释我的问题:

$ array[1]=john
$ array[2]=smith
$ array[4]=jane
$ array[5]=doe
$ echo ${array[@]}
john smith jane doe
$ echo ${array[3]}

$
Run Code Online (Sandbox Code Playgroud)

我想要一些方法去除位置3的"洞" array,这样:

  • 价值jane将移至第3位.
  • 价值doe将移至第4位.
  • 位置5的值将变为空(未设置).
  • 数组长度(本例中为4)不会更改.

是否需要通过数组编程任何循环来获得它,或者有一些更简单的方法?

更多数据:

  • 假设Bash为shell.

che*_*ner 5

只需使用元素创建一个新数组:

$ array=([1]=john smith [4]=jane doe)
$ declare -p array
declare -a array='([1]="john" [2]="smith" [4]="jane" [5]="doe")'
$ array=("${array[@]}")
$ declare -p array
declare -a array='([0]="john" [1]="smith" [2]="jane" [3]="doe")'
Run Code Online (Sandbox Code Playgroud)

请注意,这从0开始计算,而不是1.如果您确实需要基于1的数组,请将新元素添加到新数组,然后将其删除.

$ array=(foo "${array[@]}")
$ unset 'array[0]'
$ declare -p array
declare -a array='([1]="john" [2]="smith" [3]="jane" [4]="doe")'
Run Code Online (Sandbox Code Playgroud)