了解bash中=和=~运算符的区别[[ ]]

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

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

    请看下面:

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

那么哪一行是正则表达式呢?如果第一行不是正则表达式,为什么我们使用 * 的时候它能工作呢? 如果是正则表达式,但当我们不使用=~而是使用=时,如 if [[ 23ab = [0-9]{1,2}ab ]],它现在不工作。

你能解释一下这两行代码之间的区别吗?


我猜你在这里问的是关于 "bash" 的问题;Linux 上有几个不同的 shell,最好明确你所询问的是哪一个。(POSIX sh 不支持 [[ ]],因此它显然不是像 ash 或 dash 这样的纯 POSIX shell... 但从理论上讲,你也可能在问 ksh、zsh 或其他的 shell)。 - undefined
为了简单起见,您可以使用以下语法:[[ 23ab = *ab ]] && echo "yes" - undefined
1个回答

5

[[ $a =~ $b ]] 是一个正则表达式匹配。在此语法中,* 匹配零到多个紧随其后的字符或模式。

[[ $a = $b ]] 是一种类似于通配符的匹配方式。在此语法中,* 匹配任意类型的零到多个字符。

请注意,在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 ]] 是错误的,对吗? - undefined
@Jack 正确;模式或正则表达式只能出现在右侧。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接