理解bash [[]]中=和=〜运算符之间的区别

时间:2013-06-24 23:53:13

标签: regex bash

  1. if [[ 23ab = *ab ]] ; then echo yes; fi

    以上代码是正则表达式吗?

    请参阅以下内容:

  2. if [[ 23ab =~ [0-9]{1,2}ab ]] ; then echo yes; fi

  3. 那么哪一行是正则表达式?如果第一行不是正则表达式,为什么我们使用*时它会起作用? 如果是,但是当我们使用=~代替=时,就像 if [[ 23ab = [0-9]{1,2}ab ]],它现在无效。

    你能解释两条线之间的区别吗?

1 个答案:

答案 0 :(得分:4)

[[ $a =~ $b ]]是正则表达式匹配。在此语法中,*匹配前一个字符或模式的0-n个实例。

[[ $a = $b ]]是一种全局模式匹配。在此语法中,*匹配任何类型的0-n个字符。

请注意,bash中的正则表达式必须存储在变量中。那就是:

re='[0-9]{1,2}ab'
[[ $foo =~ $re ]]

实际上可能与

不同
[[ $foo =~ [0-9]{1,2}ab ]]

...取决于您正在运行的bash版本。始终使用变量可以防止这种情况造成问题。

请注意,这些都与

不同
re='[0-9]{1,2}ab'
[[ $foo =~ "$re" ]] ## <- LITERAL SUBSTRING MATCH _NOT_ REGULAR EXPRESSION MATCH

...在这种情况下,引用使$re字面的内容,即。{ 被视为现代bash中的正则表达式。