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,使用[…]]
我将把它标记为正确的-但是我会注意到这种行为很奇怪,并且没有解释其背后的逻辑。