在bash shell中,使用[[ ]]
(双中括号)而不是[ ]
(单中括号)进行条件测试,主要是因为[[ ]]
提供了更丰富的条件测试功能和更好的兼容性。对于=~
这样的正则表达式匹配操作符,它只能在[[ ]]
中使用,而不能在[ ]
中使用。
为什么使用[[ ]]
而不是[ ]
:
-
字符串比较:
[[ ]]
允许你使用<
和>
进行字符串比较,而不需要对<
和>
进行转义,因为它们在[ ]
中会被shell解释为重定向操作符。 -
模式匹配:
[[ ]]
支持使用==
和!=
进行模式匹配,其中模式可以包含通配符(如*
和?
),而[ ]
仅支持-eq
、-ne
、-lt
、-le
、-gt
和-ge
等数值比较操作符。 -
正则表达式匹配:正如你提到的,
[[ ]]
支持=~
操作符进行正则表达式匹配,这是[ ]
所不具备的。 -
逻辑组合:
[[ ]]
中的条件可以使用逻辑AND(&&
)和逻辑OR(||
)进行组合,而[ ]
中的逻辑组合需要使用-a
和-o
,但并非所有shell都支持这些操作符,且它们的优先级也可能导致混淆。 -
变量引用:在
[[ ]]
中,即使变量未加双引号,也不会因为变量内容中的空格、特殊字符等而导致问题(尽管在某些情况下,最好还是加上双引号以避免潜在的问题)。而在[ ]
中,如果变量内容包含空格或特殊字符,则可能需要对其进行引用或转义。
[[ $email =~ [a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,} ]]
行代码使用[[ ]]
和=~
操作符来检查变量$email
是否包含一个符合特定正则表达式的字符串。正则表达式用于匹配标准的电子邮件地址格式。如果$email
的内容与正则表达式匹配,则条件为真,否则为假。
总之,[[ ]]
提供了比[ ]
更强大、更灵活的条件测试功能,特别是在需要进行字符串模式匹配或正则表达式匹配时。