You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash case语句引用与未引用模式变量匹配结果差异问题咨询

该现象由Shell case语句的模式解析规则导致

Shell中case语句的模式解析遵循两个核心规则:

  • 未用引号包裹的模式:变量展开后,会被当作glob通配模式解析,通配符*、[]等会生效
  • 用双引号包裹的模式:变量展开后,会被当作纯字符串字面量处理,所有通配符都失去特殊含义

第一个测试用例命中带引号分支的原因

第一个测试用例中变量g的值为a*[b]:

  1. 第一个分支的未引号模式$g展开后为a*[b],作为glob模式的语义是:匹配a开头,中间任意字符,结尾为b的字符串。但待匹配的$g实际值是a*[b],最后一个字符是]而非b,因此匹配失败。
  2. 第二个分支的带引号模式"$g"展开后为纯字符串a*[b],和待匹配的变量值完全一致,因此匹配成功,输出quoted pattern。

第二个测试用例结果的合理性

第二个测试用例中变量g的值为a,本身不包含任何glob通配符,因此无论模式是否加引号,解析后都是a,case按顺序匹配到第一个符合的未引号分支,因此输出unquoted pattern。

关于[[ $g == "$g" ]]返回ok的补充说明

[[ ]]语法中的==运算符规则和case一致:右侧表达式加引号时做纯字符串匹配,不加引号时做glob模式匹配。测试时右侧加了引号,因此是纯字符串对比,两边值完全相等自然返回ok,和上述逻辑不冲突。


内容的提问来源于stack exchange,提问作者Paul Hodges

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 19:39:01