bash为什么与regexp上的数字不匹配

bash为什么与regexp上的数字不匹配,bash,Bash,我很好奇为什么这个代码不匹配——以“then”分支为例。它呼应“不匹配”你能告诉我吗 #!/bin/bash suffix="2" if [[ $suffix =~ "^[0-9]+$" ]] then echo "match" else echo "no match" fi 在bash的现代(3.2+)版本中,引用=或=~操作的右侧可以使字符串文字化,即不再是正则表达式或模式 发件人: 模式的任何部分都可以被引用,以强制引用的部分作为字符串进行匹配 为了在支

我很好奇为什么这个代码不匹配——以“then”分支为例。它呼应“不匹配”你能告诉我吗

 #!/bin/bash

 suffix="2"

 if [[ $suffix =~ "^[0-9]+$" ]]
 then
    echo "match"
 else
    echo "no match"
 fi

在bash的现代(3.2+)版本中,引用
=
=~
操作的右侧可以使字符串文字化,即不再是正则表达式或模式

发件人:

模式的任何部分都可以被引用,以强制引用的部分作为字符串进行匹配


为了在支持
=~
的版本之间保持一致的行为(如果需要支持3.2之前的版本),公认的最佳做法是将正则表达式放入变量中,并使用
=~
右侧未加引号的变量:

re='^[0-9]+$'
[[ $suffix =~ $re ]]

在bash的现代(3.2+)版本中,引用
=
=~
操作的右侧可以使字符串文字化,即不再是正则表达式或模式

发件人:

模式的任何部分都可以被引用,以强制引用的部分作为字符串进行匹配


为了在支持
=~
的版本之间保持一致的行为(如果需要支持3.2之前的版本),公认的最佳做法是将正则表达式放入变量中,并使用
=~
右侧未加引号的变量:

re='^[0-9]+$'
[[ $suffix =~ $re ]]

在bash的现代(3.2+)版本中,引用
=
=~
操作的右侧可以使字符串文字化,即不再是正则表达式或模式

发件人:

模式的任何部分都可以被引用,以强制引用的部分作为字符串进行匹配


为了在支持
=~
的版本之间保持一致的行为(如果需要支持3.2之前的版本),公认的最佳做法是将正则表达式放入变量中,并使用
=~
右侧未加引号的变量:

re='^[0-9]+$'
[[ $suffix =~ $re ]]

在bash的现代(3.2+)版本中,引用
=
=~
操作的右侧可以使字符串文字化,即不再是正则表达式或模式

发件人:

模式的任何部分都可以被引用,以强制引用的部分作为字符串进行匹配


为了在支持
=~
的版本之间保持一致的行为(如果需要支持3.2之前的版本),公认的最佳做法是将正则表达式放入变量中,并使用
=~
右侧未加引号的变量:

re='^[0-9]+$'
[[ $suffix =~ $re ]]


引用太多了!(关于巴什,你们不常听到这样的说法,是吗?)狗走了,我才意识到,从以前开始,它最终会沉沦的。我可以发誓在4.0之前的BASH版本中它是有效的,试试3.1.17,它是有效的(匹配)!--用引号。这就是我以前跑步的地方。嘿,真是个惊喜。我需要去查看变更日志…引用太多了!(关于巴什,你们不常听到这样的说法,是吗?)狗走了,我才意识到,从以前开始,它最终会沉沦的。我可以发誓在4.0之前的BASH版本中它是有效的,试试3.1.17,它是有效的(匹配)!--用引号。这就是我以前跑步的地方。嘿,真是个惊喜。我需要去查看变更日志…引用太多了!(关于巴什,你们不常听到这样的说法,是吗?)狗走了,我才意识到,从以前开始,它最终会沉沦的。我可以发誓在4.0之前的BASH版本中它是有效的,试试3.1.17,它是有效的(匹配)!--用引号。这就是我以前跑步的地方。嘿,真是个惊喜。我需要去查看变更日志…引用太多了!(关于巴什,你们不常听到这样的说法,是吗?)狗走了,我才意识到,从以前开始,它最终会沉沦的。我可以发誓在4.0之前的BASH版本中它是有效的,试试3.1.17,它是有效的(匹配)!--用引号。这就是我以前跑步的地方。嘿,真是个惊喜。我需要查看changelog…这对
=
来说是有意义的,因为它根据右侧的语法决定是进行精确匹配还是模式匹配。我想知道为什么
=~
是这样工作的,因为它是专门定义用来进行regexp匹配的。@Barmar,有几件事。首先,
=~
以这种方式使用,为您提供一个未经编排的匹配。第二,您只能引用
=~
表达式右侧的一部分,以使某些字符被视为文字字符,而另一些字符被视为正则表达式。@Charles请查看问题下的最后一条注释(如果可以,请运行它)@Barmar,…示例:
[[$foo=~^[0-9a-f]+-“$var”]
,匹配仅以十六进制数字和破折号开头的精确/文字字符串。这是有意义的,因为bash中没有类似于
preg_quote()
的内容。这对于
=
来说是有意义的,因为它根据右侧的语法决定是进行精确匹配还是模式匹配。我想知道为什么
=~
是这样工作的,因为它是专门定义用来进行regexp匹配的。@Barmar,有几件事。首先,
=~
以这种方式使用,为您提供一个未经编排的匹配。第二,您只能引用
=~
表达式右侧的一部分,以使某些字符被视为文字字符,而另一些字符被视为正则表达式。@Charles请查看问题下的最后一条注释(如果可以,请运行它)@Barmar,…示例:
[[$foo=~^[0-9a-f]+-“$var”]
,匹配仅以十六进制数字和破折号开头的精确/文字字符串。这是有意义的,因为bash中没有类似于
preg_quote()
的内容。这对于
=
来说是有意义的,因为它根据右侧的语法决定是进行精确匹配还是模式匹配。我想知道为什么
=~
是这样工作的,因为它是专门定义用来进行regexp匹配的。@Barmar,有几件事。首先,
=~
以这种方式使用,为您提供一个未经编排的匹配。其次,您可以只引用
=~
表达式右侧的一部分,以将某些字符视为文字字符,而将其他字符视为正则表达式。@Charles pl