在 Bash 中向数组追加元素有三种可靠方式:①用索引 ${#arr[@]} 安全追加单个含空格元素;②用 += 操作符追加单个或多个带引号元素;③用 mapfile -t 安全追加命令输出。

在 Linux Shell(Bash)中,向已有数组追加新元素有多种可靠方式,关键在于区分“单个追加”和“多个追加”,并注意索引计算与空格/特殊字符的处理。
用索引方式追加单个元素
最直观的方法是利用 ${#arr[@]} 获取当前长度,作为下一个空索引:
-
arr[${#arr[@]}]="new_item"—— 安全、明确,适用于含空格或特殊字符的值 - 例如:
fruits=("apple" "banana"); fruits[${#fruits[@]}]="cherry",结果为("apple" "banana" "cherry")
用 += 操作符追加单个或多个元素
Bash 支持 += 语法,简洁且兼容性好(Bash 3.1+):
- 追加单个:
arr+=("new_item") - 追加多个:
arr+=("item1" "item2" "item3") - 注意:右侧必须用括号包裹,且每个元素建议加双引号,避免单词分割
从命令输出追加元素
当需要把命令结果(如文件列表、进程名)追加进数组时,推荐用命令替换配合 +=:
-
arr+=($(ls *.log))—— 简单场景可用,但遇空格文件名会出错 - 更安全写法:
mapfile -t files - 或直接:
arr+=($(printf '%s\n' *.log))(依赖 glob 展开,无匹配时不报错)
注意事项:避免常见陷阱
追加操作看似简单,但几个细节容易导致意外:
-
别用
arr=("${arr[@]}" "new")替代 +=——虽可行,但每次重建整个数组,低效且易在复杂脚本中引发引用问题 -
不要省略引号:如
arr+=($var)在$var含空格时会分裂成多个元素;应写为arr+=("$var") -
${arr[*]} 和 ${arr[@]} 区别依然生效:追加后遍历时,仍需用
"${arr[@]}"保证各元素独立,尤其含空格时


















