Shell 数组元素检查的多种方法:从基础到进阶
一、基础方法:遍历数组逐个比对
bash
business_array=(clbps orbps gcss irap csbps amls)
business="gcss"
found=0# 遍历数组元素
for item in "${business_array[@]}"; doif [ "$item" = "$business" ]; thenfound=1break # 找到后跳出循环fi
doneif [ $found -eq 1 ]; thenecho "业务 $business 存在于数组中"
elseecho "业务 $business 不在数组中"
fi
- 兼容性极好,支持所有版本的 Bash 和 POSIX Shell
- 逻辑清晰,易于理解和调试
- 不存在正则匹配的边缘情况问题
- 代码相对冗长,需要额外的循环和标记变量
- 当数组元素较多时,效率略低于其他方法
二、正则匹配法:利用字符串拼接与正则
bash
business_array=(clbps orbps gcss irap csbps amls)
business="irap"# 核心判断逻辑
if [[ ${business_array[*]} =~ (^|[[:space:]])"$business"($|[[:space:]]) ]]; thenecho "业务 $business 存在于数组中"
elseecho "业务 $business 不在数组中"
fi
${business_array[*]}
将数组元素用空格拼接成字符串(如 "clbps orbps gcss...")(^|[[:space:]])
匹配字符串开头或任意空白字符(避免部分匹配,如 "gc" 匹配 "gcss")($|[[:space:]])
匹配字符串结尾或任意空白字符(同理避免部分匹配)
- 代码简洁,一行即可完成判断
- 无需循环,执行效率较高
- 正则表达式相对复杂,不易理解
- 当元素包含特殊字符(如
.
*
等正则元字符)时可能失效 - 仅支持 Bash,不兼容 POSIX Shell
三、简化匹配法:空格包裹的字符串比对
bash
business_array=(clbps orbps gcss irap csbps amls)
business="csbps"# 核心判断逻辑(最推荐的写法)
if [[ " ${business_array[@]} " =~ " $business " ]]; thenecho "业务 $business 存在于数组中"
elseecho "业务 $business 不在数组中"
fi
" ${business_array[@]} "
拼接后会形成 "clbps orbps gcss ... amls"(前后都有空格)" $business "
会形成 "csbps"(目标值前后加空格)- 只要目标值是数组元素,就一定会被完整包含在拼接后的字符串中
- 代码比正则法更简洁,可读性更好
- 避免了复杂正则,降低出错概率
- 效率与正则法相当,且兼容大部分 Bash 版本
- 仍不兼容 POSIX Shell(仅支持 Bash)
- 若元素本身包含空格,会导致判断失效(但数组元素通常不包含空格)
四、性能对比与适用场景
方法 | 兼容性 | 可读性 | 效率 | 适用场景 |
遍历比对 | 所有 Shell | 高 | 中 | 数组元素少、需兼容旧系统 |
正则匹配法 | Bash 3.0+ | 中 | 高 | 熟悉正则、元素无特殊字符 |
简化匹配法 | Bash 3.0+ | 高 | 高 | 大多数 Bash 脚本场景(推荐) |
五、避坑指南
if [ ${#business_array[@]} -eq 0 ]; thenecho "数组为空,无法检查元素"exit 1
fi
if [ -z "$business" ]; thenecho "变量 business 未定义"exit 1
fi