unset
删除一个元素。它不会重新编号其余元素。
我们可以declare -p
用来查看到底发生了什么numbers
:
$ unset "numbers[i]"
$ declare -p numbers
declare -a numbers=([0]="53" [1]="8" [2]="12" [3]="9" [5]="69" [6]="8" [7]="7" [8]="1")
观察numbers
不再有元素4
。
另一个例子
观察:
$ a=()
$ a[1]="element 1"
$ a[22]="element 22"
$ declare -p a
declare -a a=([1]="element 1" [22]="element 22")
数组a
没有2到21的元素。Bash不需要数组索引是连续的。
建议的方法,以强制重新编号索引
让我们从numbers
缺少元素的数组开始4
:
$ declare -p numbers
declare -a numbers=([0]="53" [1]="8" [2]="12" [3]="9" [5]="69" [6]="8" [7]="7" [8]="1")
如果我们希望更改索引,则:
$ numbers=("${numbers[@]}")
$ declare -p numbers
declare -a numbers=([0]="53" [1]="8" [2]="12" [3]="9" [4]="69" [5]="8" [6]="7" [7]="1")
现在有一个元素编号,4
并且它具有值69
。
一步删除元素并重新编号数组的另一种方法
再次,让我们定义numbers
:
$ numbers=(53 8 12 9 784 69 8 7 1)
正如Toby Speight在评论中所建议的那样,一种删除第四个元素并对其余元素重新编号的方法只需一步即可:
$ numbers=("${numbers[@]:0:4}" "${numbers[@]:5}")
$ declare -p numbers
declare -a numbers=([0]="53" [1]="8" [2]="12" [3]="9" [4]="69" [5]="8" [6]="7" [7]="1")
如您所见,第四个元素被删除,其余所有元素都被重新编号。
${numbers[@]:0:4}
slices array numbers
:它以元素0开头的前四个元素。
类似地,${numbers[@]:5}
slice array numbers
:它采用所有从元素5开始并一直到数组结尾的元素。
获取数组的索引
数组的值可以使用获取${a[@]}
。要查找与这些值相对应的索引(或键),请使用${!a[@]}
。
例如,再次考虑numbers
缺少元素的数组4
:
$ declare -p numbers
declare -a numbers=([0]="53" [1]="8" [2]="12" [3]="9" [5]="69" [6]="8" [7]="7" [8]="1")
要查看分配了哪些索引:
$ echo "${!numbers[@]}"
0 1 2 3 5 6 7 8
再次,4
从索引列表中丢失。
文献资料
来自man bash
:
该unset
内建是用来摧毁阵列。 unset name[subscript]
销毁index处的数组元素subscript
。如上所述,对索引数组的负下标进行解释。必须注意避免由路径名扩展引起的有害副作用。 unset name
,其中name
是一个数组,或unset name[subscript]
,其中subscript
是 *
或 @
,删除整个阵列。