Shell脚本中if/else语句对乘法运算符(*)判断异常问题
异常根因
elif [[ $op == * ]] 永远返回真的核心原因,是Bash的[[ ]]结构会把==右侧的字符串解析为通配匹配模式,而非固定待匹配字符串:
- 单独书写的
*是Bash内置通配符,代表“匹配任意长度、任意内容的字符串” - 只要
$op有非空值,不管是除法符/、幂符^还是其他任意输入,都能被这个通配模式匹配,条件自然恒成立。
修正方案
要实现“判断输入是否为字面乘号*”的逻辑,可选择以下任意一种可靠写法:
- 对通配符做转义,使其失去特殊匹配含义:
elif [[ $op == \* ]] - 用单引号包裹字面乘号,明确指定这是固定匹配值:
elif [[ $op == '*' ]] - 绕开通配匹配逻辑,使用单括号执行严格字符串相等判断:
elif [ "$op" = '*' ]
补充说明
类似/、^、+这类不属于Bash通配规则定义的特殊字符,直接写在==后不会触发通配匹配逻辑,因此不会出现和*一致的判断失效问题,这也是你仅在匹配乘号的分支遇到误判的原因。
内容的提问来源于stack exchange,提问作者L'Agatha
相关产品推荐
相关产品推荐

