Bash:为什么比较优先级与通配符有关?

Bash:为什么比较优先级与通配符有关?,bash,shell,Bash,Shell,当测试字符串包含通配符时,=是否像中的操作符一样工作?它非常神奇 例1: string='My long string'; if [[ $string == *"My long"* ]]; then echo "It's there!"; fi 输出: It's There 例2: if [[ *"My long"* == $string ]]; then echo "It's there!"; fi 没有输出 Glob模式只适用于比较的右侧,这就是为什么 if [[ *"My l

当测试字符串包含通配符时,
=
是否像
中的
操作符一样工作?它非常神奇

例1:

string='My long string';
if [[ $string == *"My long"* ]]; then   echo "It's there!"; fi
输出:

It's There
例2:

if [[ *"My long"* == $string ]]; then   echo "It's there!"; fi

没有输出

Glob模式只适用于比较的右侧,这就是为什么

if [[ *"My long"* == $string ]]; then   echo "It's there!"; fi
将失败

即使这样也不行:

[[ *"My long"* == "My long" ]] && echo "It's there!"
但这将起作用:

[[ "My long" == *"My long"* ]] && echo "It's there!"
It's there!

如果您询问这是如何工作的:

string='My long string';
if [[ $string == *"My long"* ]]; then   echo "It's there!"; fi
然后,由于在使用
*

这意味着匹配文字文本“My long”
前后的任何内容,并且由于您的输入确实包含“My long”
,因此匹配成功。

这就是设计的工作原理。手册上有:

当“==”和“!=”如果使用运算符,则运算符右侧的字符串被视为一个模式,并根据模式匹配中下面描述的规则进行匹配


是的,我得到了那个部分,但是这个魔术背后的逻辑是什么?一个
==
操作符的
边是不一致的,这违反了正常的逻辑。好的,检查我更新的答案,如果你有更多问题,请告诉我。是的,我想知道,那个认为将
equal
设计成实际上是
notequal
的实现是一个好主意的家伙是否使用了迷幻药(哪一种?)或吸食可卡因,或者两者兼而有之。是的,甚至
[[“My long”=*“My long”*]&&echo“它就在那里!”
都会起作用。这是因为在BASH中使用了glob matching,使用
[…]]
我将把它标记为正确的-但是我会注意到这种行为很奇怪,并且没有解释其背后的逻辑。