Linux Shell中遍历数组推荐使用"${arr[@]}"安全获取每个元素,支持空格和特殊字符;需索引时用"${!arr[@]}";避免不加引号或误用"*"导致分割错误。

在Linux Shell中遍历数组元素,核心是用 for 循环 配合数组展开语法 ${array[@]}(推荐)或 ${array[*]}(慎用)。关键在于正确引用数组、避免空格/特殊字符导致的分割错误。
使用 ${array[@]} 安全遍历每个元素
这是最常用也最安全的方式,@ 会把每个数组元素当作独立参数传递,即使元素含空格或通配符也不会出错。
示例:
for item in "${arr[@]}"; do
echo "处理: $item"
done
获取索引再遍历(需要下标操作时)
如果需同时访问下标和值(比如跳过某项、修改原数组),可用 !array[@] 获取所有索引。
示例:
arr=("a" "b" "c")for i in "${!arr[@]}"; do
echo "索引 $i → 值 ${arr[i]}"
done
注意别踩这些坑
-
不加引号直接写
$arr或${array}:只取第一个元素,且不支持空格 -
用
${array[*]}替代${array[@]}:所有元素被合并成一个字符串,用IFS第一个字符连接(默认空格),遇空格就断开 - for item in $arr(无引号、无@):触发单词拆分和路径名展开,危险!
-
数组未声明或为空时:
"${arr[@]}"展开为空,循环体不会执行,这是预期行为
其他实用技巧
- 检查数组长度:
echo ${#arr[@]} - 遍历子集(如第2到第4个):
for item in "${arr[@]:1:3}"; do ...(从索引1开始取3个) - 配合
while read处理命令输出生成的“伪数组”:printf '%s\n' "${arr[@]}" | while read -r line; do ... done(注意变量作用域)


















