简述 [[ $string == abc\* \]] 和 [[ $string == “abc\*” ]] 有什么区别 ?
参考回答
[[ $string == abc\* ]]
和 [[ $string == "abc\*" ]]
在使用时有显著的区别,主要体现在 通配符的匹配 上。具体区别如下:
[[ $string == abc\* ]]
:- 这里使用了 转义字符
\*
,它表示匹配以"abc*"
为字面值的字符串,不会将*
视为通配符。 - 它仅仅会检查字符串
string
是否精确匹配"abc*"
(即包括星号字符*
本身,而不是作为通配符)。
- 这里使用了 转义字符
[[ $string == "abc\*" ]]
:- 在双引号中的
*
仍然是一个字面字符,而不是一个通配符。与[[ $string == abc\* ]]
相同,*
是作为普通字符来处理,而不是用于匹配任意字符。 - 这样写实际上与第一个例子没有区别,
*
仍然被视为字符*
本身,而不是通配符。
- 在双引号中的
详细讲解与拓展
[[ $string == abc\* ]]
:- 在这种情况下,
*
是通过反斜杠\
进行转义的,它并不会被当作通配符,而是单纯的字符*
。 - 如果
string
的值正好是"abc*"
(包含字面上的*
),则会返回 真。
示例:
输出:
Match found
- 在这种情况下,
[[ $string == "abc\*" ]]
:- 双引号中的
*
会作为普通字符*
进行处理,因此这个语句也在匹配string
是否等于"abc*"
。 - 因此,这个语句和上面的例子没有本质区别。
示例:
输出:
Match found
- 双引号中的
- 通配符用法:
- 如果你想让
*
起到通配符的作用,用于匹配任意字符,可以省略反斜杠\
。
示例:
输出:
Match found
这里,
abc*
将匹配以abc
开头的任意字符串。 - 如果你想让
总结
[[ $string == abc\* ]]
和[[ $string == "abc\*" ]]
都是字面值匹配,*
被当作普通字符处理,不作为通配符。[[ $string == abc* ]]
才是通配符匹配,*
将匹配任意字符。