Bash判断值是否存在于数组时单数字误匹配双数字如何解决
问题原因
你当前的写法是将数组整体展开为空格分隔的字符串后用=~做正则子串匹配,只要目标值作为任意子串出现在字符串中就会判定为命中,因此单数字1会匹配到元素10里的1字符,不符合精确匹配数组元素的需求。
解决方法
方法1:正则加边界匹配(改动最小的方案)
给匹配逻辑前后加空格做精确的完整元素匹配,兼容性优于单词边界符,避免特殊字符场景下失效:
if [[ ! " ${allStatus[@]} " =~ " $i " ]]
修改后的场景1运行效果符合预期:
abc@xyz $ i=1 abc@xyz $ allStatus=(2 3 4 5 6 7 8 9 10) abc@xyz $ if [[ ! " ${allStatus[@]} " =~ " $i " ]] > then > echo OK > fi OK
方法2:遍历数组逐个比对(兼容性最强)
如果数组元素包含空格、特殊符号等复杂内容,遍历比对的方式最稳妥,不会出现匹配歧义:
exists=0 for status in "${allStatus[@]}"; do [[ "$status" == "$i" ]] && { exists=1; break; } done [[ $exists -eq 0 ]] && echo OK
方法3:关联数组映射(高频判断场景性能最优)
如果需要多次判断值是否在数组中,可以提前把数组转成关联数组,后续判断的时间复杂度为O(1):
# 提前初始化关联映射 declare -A status_map for status in "${allStatus[@]}"; do status_map[$status]=1 done # 后续直接查映射即可 [[ ! ${status_map[$i]} ]] && echo OK
内容的提问来源于stack exchange,提问作者Pradeep Rathod
相关产品推荐
相关产品推荐

