if [[ 23ab = *ab ]] ; then echo yes; fi
以上代码是正则表达式吗?
请看下面:
if [[ 23ab =~ [0-9]{1,2}ab ]] ; then echo yes; fi
那么哪一行是正则表达式呢?如果第一行不是正则表达式,为什么我们使用 * 的时候它能工作呢?
如果是正则表达式,但当我们不使用=~
而是使用=
时,如
if [[ 23ab = [0-9]{1,2}ab ]]
,它现在不工作。
你能解释一下这两行代码之间的区别吗?
[[ $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中不会像正则表达式一样被处理。
[[ ]]
,因此它显然不是像 ash 或 dash 这样的纯 POSIX shell... 但从理论上讲,你也可能在问 ksh、zsh 或其他的 shell)。 - undefined[[ 23ab = *ab ]] && echo "yes"
- undefined