简单的Bash和RegEx问题

简单的Bash和RegEx问题,regex,bash,bash4,Regex,Bash,Bash4,我无法在Bash4.1中使用正则表达式获得正确匹配的模式。我读过一些关于引号和非引号的区别的信息,但我认为这不是我的问题 我的目标是检查并确保脚本提供了一个有效的ID。在本例中,有效的ID是一个9位数的字符串。据我所知,它的正则表达式是\d{9}。鉴于以下是我要检查的代码片段: id=$1 if [[ $id =~ \d{9} ]]; then echo "This is a vaild ID" else echo "This is not a vaild ID

我无法在Bash4.1中使用正则表达式获得正确匹配的模式。我读过一些关于引号和非引号的区别的信息,但我认为这不是我的问题

我的目标是检查并确保脚本提供了一个有效的ID。在本例中,有效的ID是一个9位数的字符串。据我所知,它的正则表达式是\d{9}。鉴于以下是我要检查的代码片段:

id=$1       
if [[ $id =~ \d{9} ]]; then
     echo "This is a vaild ID"
else
     echo "This is not a vaild ID"
fi
然后使用以下命令调用脚本:

 ./script 987654321
很明显我错过了什么

试试这个:

if [[ $id =~ [0-9]{9} ]]; then
看起来bash没有将
\d
识别为
[0-9]

不支持
\d

根据ERE的语法(词汇约定),转义字符的形式为
\SPEC\u CHAR
<代码>规格字符可以是以下任意一种:

^    .    [    $    (    )    |
*    +    ?    {    \

问题是\d在被解释之前被转换为d。尝试双重逃跑

\d{9} => d{9}
\\d{9} => \d{9}
或者,你可以把它放在引号里

if [[ $id =~ "\d{9}" ]]

正如其他人已经回答的那样,您应该使用
[0-9]{9}
,因为不支持
\d
。但另一个重要的部分是,你必须使用锚

^[0-9]{9}$
^
将正则表达式锚定到字符串的开头,
$
将其锚定到结尾。如果不使用它们,正则表达式将匹配序列中包含9位数字的每个字符串,如“abc123456789”、“ASDF1234567889ZUI”或“123456789FOOBAR”

这将起作用:如果[$id=~[:digit:]{9}]]-大卫·W·11小时前


@大卫:我在bash上试过,但似乎不起作用10小时前的Vivin Paliath


我刚刚编写了一个测试程序:

#! /bin/bash

for id in 123456789 12345689 1234567890 987654321
do
    if [[ $id =~ ^[[:digit:]]{9}$ ]]
    then
        echo "$id is 9 digits long"
    else
        echo "$id is bad"
    fi
done
我得到了以下结果:

DaveBook:~ david$ ./test.sh
123456789 is 9 digits long
12345689 is bad
1234567890 is bad
987654321 is 9 digits long
DaveBook:~ david$ 
我在Mac OS X上使用BASH 3.2.48,在Cygwin上使用BASH 4.1.10(4)(哇,Mac版本是旧的?)。我还没有在Linux机器上测试过这个

你用的是什么版本?您是否在
:digit:
周围将方括号加倍?它必须是
[[:digit:][]
,而不是
[:digit:][/code>

我还意识到我需要
^
$
锚定在那里,因为您不想匹配
foo123456789bar
12345678901346790
。这是你的问题吗


问题是
[[:digit:][]
应该已经起作用了。我在许多bashshell脚本中使用过它,认为它相当通用。但是,如果您的bashshell不起作用,我将不得不停止使用它。

您应该编辑您的问题,包括您认为它不起作用的原因。你要去别的地方吗?或者您是否遇到语法错误。祝你好运。Bash(v3及更高版本)中的Regexp不支持
\d
,你可以使用
[0-9]
[:digit:
posix字符类。完全可移植的方法是使用全局模式,即[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]中的
case$id;*)在痛苦中死去;;esac
我不知道我之前抽的是什么,但我现在刚试过,效果不错。我可以发誓,当我最后一次尝试它时,它不起作用,因为这是我第一次尝试的东西之一。这就是我想要的。谢谢。您是否有一篇参考文章来查找/d&[:digit:]等项之间的等式,或者手册页是最好的资源?实际上,最好的来源是Perl文档。毕竟,所有扩展正则表达式的内容最初都来自Perl。看一看和角色类有关的部分。非常感谢!不过,您如何指定一个最多9位数的数字?@David我已经测试过了,现在可以使用了。我不知道为什么我第一次尝试它时它不起作用。为什么你必须把[[和]]放在:数字:?