Bash case语句引用与未引用模式变量匹配结果差异问题咨询
该现象由Shell case语句的模式解析规则导致
Shell中case语句的模式解析遵循两个核心规则:
- 未用引号包裹的模式:变量展开后,会被当作glob通配模式解析,通配符
*、[]等会生效 - 用双引号包裹的模式:变量展开后,会被当作纯字符串字面量处理,所有通配符都失去特殊含义
第一个测试用例命中带引号分支的原因
第一个测试用例中变量g的值为a*[b]:
- 第一个分支的未引号模式
$g展开后为a*[b],作为glob模式的语义是:匹配a开头,中间任意字符,结尾为b的字符串。但待匹配的$g实际值是a*[b],最后一个字符是]而非b,因此匹配失败。 - 第二个分支的带引号模式
"$g"展开后为纯字符串a*[b],和待匹配的变量值完全一致,因此匹配成功,输出quoted pattern。
第二个测试用例结果的合理性
第二个测试用例中变量g的值为a,本身不包含任何glob通配符,因此无论模式是否加引号,解析后都是a,case按顺序匹配到第一个符合的未引号分支,因此输出unquoted pattern。
关于[[ $g == "$g" ]]返回ok的补充说明
[[ ]]语法中的==运算符规则和case一致:右侧表达式加引号时做纯字符串匹配,不加引号时做glob模式匹配。测试时右侧加了引号,因此是纯字符串对比,两边值完全相等自然返回ok,和上述逻辑不冲突。
内容的提问来源于stack exchange,提问作者Paul Hodges
相关产品推荐
相关产品推荐

