最直接方式是用 unset array_name[index] 删除指定索引元素,该操作留空索引但不改变其余索引;如需连续下标,可执行 arr=("${arr[@]}") 重排索引。

在 Linux Shell 中,删除数组中指定索引位置的某一项,最直接的方式是使用 unset 命令。它不会改变其他元素的索引(即数组会“留空”),但后续可通过重新索引来整理。
用 unset 删除指定索引的数组元素
unset 是标准且兼容性最好的方法,适用于 bash、zsh 等主流 shell。
- 语法:
unset array_name[index] - 例如,删除数组
arr=(a b c d)中第 2 项(索引为 1):unset arr[1] - 执行后,
arr变为(a [2]="c" [3]="d")—— 索引 1 被移除,但 2 和 3 保持不变
重新索引数组(可选,让下标连续)
如果希望删除后数组下标从 0 开始连续排列(比如用于遍历或传参),需手动重建:
- 方法一(推荐):
arr=("${arr[@]}")
利用"${arr[@]}"展开所有非空元素,再赋值给自身,自动重排索引 - 方法二(显式循环):
new_arr=(); for i in "${arr[@]}"; do new_arr+=("$i"); done; arr=("${new_arr[@]}")
按值删除(而非索引)需额外处理
Shell 数组不支持直接按值删除,需配合循环或条件判断:
- 例如删除值为
"b"的第一项:for i in "${!arr[@]}"; do [[ "${arr[i]}" == "b" ]] && { unset "arr[i]"; break; }; done - 再执行
arr=("${arr[@]}")整理索引
注意事项
避免常见误区:
-
arr[index]=""只是清空该位置的值,索引仍存在,"${#arr[@]}"长度不变 -
unset arr(无索引)会整个删除数组变量,不是删某一项 - 负数索引(如
-1)在 bash 4.3+ 支持,但unset arr[-1]删除的是最后一个元素,注意版本兼容性


















