2013-06-24 29 views
2
  1. if [[ 23ab = *ab ]] ; then echo yes; fi了解之间的差=和=〜运营商在bash [[]]

    是对上面的代码正则表达式?

    请参阅以下内容:

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

因此,这行是一个正则表达式?如果第一行不是正则表达式,为什么当我们使用*时会起作用? 如果是,但是当我们使用=而不是=~时,如 if [[ 23ab = [0-9]{1,2}ab ]],它现在不起作用。

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

+0

我假设你在问这里“bash”有几种不同的shell可以在Linux上运行,最好清楚一下你问的是哪一个。 (POSIX sh不支持'[[]]',所以它显然不是一个纯粹的POSIX shell,比如ash或dash ...但理论上你可以问ksh或者zsh或其他的) 。 –

+0

为简单起见,您可以使用以下语法:'[[23ab = * ab]] && echo“yes”' –

回答

4

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

[[ $a = $b ]]是一个glob风格的模式匹配。在此语法中,*匹配任何类型的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中的正则表达式那样处理。

+1

嗨Charles, 非常感谢!还有一个问题,正则表达式必须放在右边,我的意思是:[[$ foo =〜[0-9] {1,2} ab]]是正确的! 但[[[0-9] {1,2} ab =〜$ foo]]是错误的,对吧? – Jack

+0

@Jack正确;该模式或正则表达式可能只在右侧。 –