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

时间:2014-12-18 19:39:27

标签: bash shell

当测试字符串包含通配符时,==是否像IN运算符一样运行?这太神奇了......

example1:

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

没有输出。

2 个答案:

答案 0 :(得分:4)

这就是[[ ]]设计工作的方式。它在手册中:

  

当使用'=='和'!='运算符时,运算符右侧的字符串被视为模式,并根据模式匹配中的下述规则进行匹配。

答案 1 :(得分:2)

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

然后,由于在使用glob

的RHS模式上使用*匹配,它正在运行

这意味着匹配文字文本"My long"之前和之后的任何内容,因为您的输入确实包含"My long",因此匹配成功。