shell遍历数组过滤的核心是组合遍历与条件判断:①直接遍历${arr[@]}配合if判断,适用于值匹配;②按索引${!arr[@]}遍历,支持位置约束;③结合grep/awk处理复杂文本;④用break/continue控制流程。

Shell里遍历数组并做过滤,核心是把“遍历”和“判断”组合起来——先拿到每个元素,再用 if 或其他测试命令决定是否处理它。不需要额外工具,纯 Bash 就能完成。
直接遍历 + 条件判断(最常用)
适用于大多数场景:只关心元素值本身,不依赖索引。用 ${arr[@]} 展开全部元素,配合 if 判断即可。
- 写法简洁,可读性强
- 推荐对字符串内容做匹配(如包含某子串、以某字符开头、长度达标等)
- 示例:只打印长度大于 4 的水果名
# 定义数组
fruits=("apple" "kiwi" "banana" "fig" "cherry")
# 遍历并过滤
for f in "${fruits[@]}"; do
if [ ${#f} -gt 4 ]; then
echo "$f"
fi
done
输出:apple banana cherry
按索引遍历 + 动态过滤逻辑
当你需要同时使用元素值和它的位置(比如跳过第 2 个、只处理偶数下标),就用索引方式遍历。
- 用
${!arr[@]}获取所有合法索引 - 可在循环体内自由组合索引和值,比如
${arr[i]}和$i - 适合带位置约束的过滤,如“跳过索引为 0 的元素”或“只处理前三个”
# 示例:跳过第一个元素,其余全转大写输出
names=("Alice" "bob" "Charlie" "diana")
for i in "${!names[@]}"; do
if [ "$i" -eq 0 ]; then continue; fi
echo "${names[i]^^}"
done
输出:BOB CHARLIE DIANA
结合 grep / awk 做复杂文本过滤
如果过滤条件较复杂(比如正则匹配邮箱、提取数字字段、多条件组合),可把数组元素逐个传给外部命令处理。
- 避免在 shell 中手写冗长的
case或嵌套if - 注意引号保护,防止空格或特殊字符破坏命令结构
- 示例:只保留含字母 'e' 且不含空格的字符串
# emails=("user@example.com" "test@domain.org" "no-match" "with space@x.y")
for e in "${emails[@]}"; do
if echo "$e" | grep -qE '^[^[:space:]]+@[^[:space:]]+\.[^[:space:]]+$' && echo "$e" | grep -q 'e'; then
echo "$e"
fi
done
提前终止或跳过某些元素(break / continue)
实际脚本中常需中断流程:比如找到第一个匹配项就退出,或跳过无效数据继续下一个。
-
break:立刻结束整个循环 -
continue:跳过当前轮次,进入下一轮 - 两者都支持带数字参数(如
break 2跳出两层循环),但单层足够用
# 找到第一个以 'b' 开头的单词就停止
words=("apple" "banana" "cherry" "blueberry")
for w in "${words[@]}"; do
if [[ "$w" == b* ]]; then
echo "found: $w"
break
fi
done











