Bash脚本while循环匹配字符串不符合预期问题求助
Bash脚本通配符匹配问题修复
问题根源
你的脚本存在两个关键问题:
- 循环输出逻辑混乱:每遍历一行就输出一次结果,当
job=house时,第一行car*不匹配会输出not found,第二行匹配才输出found,容易造成误解;而且找到匹配后仍会继续循环,多余输出干扰判断。 - 可能的隐形字符干扰:如果
exceptions.cfg里的house行带有末尾空格、制表符等隐形字符,会导致匹配失败。
修复后的代码
excepcion=no while read -r LineExc; do # 移除行首尾的所有空白字符(含空格、制表符) LineExc=$(echo "$LineExc" | xargs) # 跳过空行,避免无效匹配 [[ -z "$LineExc" ]] && continue if [[ "${job}" == $LineExc ]]; then echo "found" excepcion=yes # 找到匹配后立刻终止循环,减少不必要的遍历 break fi done < exceptions.cfg # 只有完全没匹配到才输出not found if [[ "$excepcion" == "no" ]]; then echo "not found" fi
关键修改说明
- 用
xargs清理读取到的行内容,消除隐形空白字符导致的匹配失败 - 找到匹配后用
break终止循环,避免后续行的无效处理和输出干扰 - 把
not found的输出移到循环外,只有遍历完所有行都没匹配才输出,结果更直观 - 提前初始化
excepcion变量,避免未定义的逻辑问题
内容的提问来源于stack exchange,提问作者absolute333
相关产品推荐
相关产品推荐

