Shell脚本中如何判断指定值不存在于数组并输出错误?
错误原因
你的代码逻辑存在判断颠倒的问题:遍历数组时只要遇到第一个和$2不相等的元素,就会直接将match设为1并跳出循环,根本不会继续检查后续元素,所以无论传入的值是否存在于数组中,只要和第一个元素不匹配就会输出错误提示。
正确实现
方案1:遍历数组修正版(适配小体量数组)
在原有写法的基础上调整判断逻辑:找到匹配项时标记状态并终止遍历,遍历完全部元素仍未匹配再输出错误。
declare -a arr=("crm" "hr" "pos") match=0 for i in "${arr[@]}"; do # 找到匹配项时更新标记、跳出循环 if [[ "$2" == "$i" ]]; then match=1 break fi done # 遍历结束后仍未匹配则输出错误 if [[ $match -eq 0 ]]; then echo "No match found" # 可按需添加错误退出:exit 1 fi
方案2:关联数组查找版(适配大体量数组,性能更高)
如果数组元素较多,遍历的性能会下降,可以提前把数组值存为关联数组的键,直接通过键存在性判断完成匹配,不需要遍历:
declare -a arr=("crm" "hr" "pos") declare -A arr_check_map # 先把数组元素存入关联数组做索引 for i in "${arr[@]}"; do arr_check_map["$i"]=1 done # 直接判断键是否存在 if [[ ! -v arr_check_map["$2"] ]]; then echo "No match found" fi
注意事项
- 变量引用时尽量加双引号,避免参数包含空格、特殊字符时出现判断异常
- 整数相等比较推荐用
-eq运算符,和字符串比较做明确区分,减少歧义
内容的提问来源于stack exchange,提问作者Nurhun
相关产品推荐
相关产品推荐

