shell一维数组功能简洁实用,适合处理命令行参数等场景;支持显式索引赋值(如arr[0]="a")和整体初始化(如arr=("apple" "banana" "cherry")),下标从0开始且可稀疏。

Shell脚本中的一维数组功能简洁但实用,适合处理命令行参数、配置项列表或临时数据集合。它不支持多维、动态类型或自动扩容,但掌握定义、遍历和基本增删操作,就能覆盖大多数自动化场景。
一维数组的定义方式
Shell数组支持显式索引赋值和整体初始化两种常用方式,下标从0开始,允许不连续(稀疏数组):
- 逐个赋值:`arr[0]="a"; arr[1]="b"; arr[2]="c"`
- 一次性初始化:`arr=("apple" "banana" "cherry")`(括号内用空格分隔)
- 从命令输出构建:`mapfile -t arr
- 带索引的混合初始化:`arr=([0]="x" [2]="y" [5]="z")` —— 中间索引为空,数组长度仍为6(`echo ${#arr[@]}`)
安全遍历数组元素
推荐使用 `"${arr[@]}"` 配合 for 循环,确保含空格或特殊字符的元素不被拆分:
-
按值遍历(最常用):
for item in "${arr[@]}"; do echo "$item"; done -
按索引遍历(需索引操作时):
for idx in "${!arr[@]}"; do echo "[$idx]: ${arr[$idx]}"; done - 避免错误写法:`for item in ${arr[@]}`(未加引号,遇空格会分割)、`for item in $arr`(只取首元素)
添加与删除数组元素
Shell数组没有内置的 push/pop 命令,但可通过拼接或 unset 实现等效效果:
- 末尾追加元素:`arr+=("new_item")` 或 `arr[${#arr[@]}]="new_item"`
- 开头插入元素:`arr=("first" "${arr[@]}")`(注意引号保留原结构)
- 删除指定索引元素:`unset arr[2]`(该位置变为空,数组长度不变;可用 `"${arr[@]}"` 查看剩余值)
-
删除并重建紧凑数组(去空洞):
arr=("${arr[@]}")(重新展开再赋值,索引自动重排为0起始连续) - 清空整个数组:`arr=()` 或 `unset arr`
常见陷阱与建议
实际编写时容易忽略细节,导致逻辑异常:
- 数组变量名不能和普通变量同名,否则后者会覆盖前者(如先 `arr=1` 再 `arr=("a" "b")`,前者被丢弃)
- `${#arr}` 返回首元素长度,要获取元素个数必须用 `${#arr[@]}` 或 `${#arr[*]}`
- 用 `declare -a arr` 显式声明数组可提升可读性,尤其在函数内避免意外覆盖
- 若需频繁增删或查找,考虑改用 awk 或临时文件——Shell数组本质是静态结构,不适合高频修改场景











