为什么顺序对Bash中带双括号的相等运算符(";==";)很重要?

为什么顺序对Bash中带双括号的相等运算符(";==";)很重要?,bash,Bash,下面的命令按照我的预期工作,打印出“huh?”: 但如果切换操作数的顺序,则不会打印任何内容: $ if [[ *odd* == "odd behavior" ]]; then echo "huh?"; fi <no output> $if[[*odd*==“odd behavior”];然后回显“huh?”;fi 这似乎与我的直觉相反。有人能解释为什么行为不同吗?右参数经过特殊处理,可以是通配符模式,但左参数不能。从: 使用“==”和“!=”运算符时,运算符右侧的字符串被视为一

下面的命令按照我的预期工作,打印出“huh?”:

但如果切换操作数的顺序,则不会打印任何内容:

$ if [[ *odd* == "odd behavior" ]]; then echo "huh?"; fi
<no output>
$if[[*odd*==“odd behavior”];然后回显“huh?”;fi

这似乎与我的直觉相反。有人能解释为什么行为不同吗?

右参数经过特殊处理,可以是通配符模式,但左参数不能。从:

使用“==”和“!=”运算符时,运算符右侧的字符串被视为一个模式,并根据模式匹配中下面描述的规则进行匹配,就像启用了extglob shell选项一样。“=”运算符与“=”相同。如果nocasematch shell选项(请参阅shopt内置中shopt的说明)已启用,不考虑字母字符的情况执行匹配。如果字符串匹配('=')或与模式不匹配(“!=”)则返回值为0,否则为1。模式的任何部分都可以被引用,以强制将引用的部分匹配为字符串


看一看:
help[[
*odd*
是一个操作,
“odd behavior”
只是一个文本。在第二种情况下,首先根据“odd behavior”执行并评估该操作这很可能是
false
。然而,在第一种情况下,运算的计算结果为成功的非零结果,并且当与文本进行比较时(不是通过值,而是在类型转换期间简单地非null)结果是1==1,这是
真的
。谢谢你,非常简洁的回答!我没有意识到左操作数与右操作数的处理方式不同(即作为模式)。很高兴知道!为了更简洁,引号中的文本是文字字符串,
*
是正则表达式。
“奇怪的行为”
包含在由
*odd*
定义的集合中,但由
*odd*
定义的集合中的所有内容都不包含在
的“奇行为”中
@KipK它与引号无关。你只能把通配符放在右边。但是如果你把它放在右边的引号里,那么它就根本不是通配符。如果你只是在做普通的比较,顺序并不重要。我知道,我说的是这两个值的文字解释,而不仅仅是
[]
的工作原理。
$ if [[ *odd* == "odd behavior" ]]; then echo "huh?"; fi
<no output>