8

我无法在 bash 4.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

我错过了什么明显的东西?

4

4 回答 4

9

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

^[0-9]{9}$

^正则表达式锚定到字符串的开头并将其$锚定到结尾。如果您不使用它们,您的正则表达式将匹配每个包含 9 位数字的字符串,例如“abc123456789”、“asdf123456789zui”或“123456789FOOBAR”。

于 2011-09-16T05:49:17.613 回答
9

这将起作用: if [[ $id =~ [[:digit:]]{9} ]] – David W. 11 小时前


@David 我在 bash 上尝试过,但似乎没有用。– Vivin Paliath 10 小时前


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

#! /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:]

我还意识到我需要^and$锚点,因为你不想匹配foo123456789baror 1234567890123456790。这是您遇到的问题吗?

事情是[[:digit:]] 应该奏效的。我在许多 Bash shell 脚本中使用过它,认为它相当通用。但是,如果您的 BASH shell 无法正常工作,我将不得不停止使用它。

于 2011-09-16T13:49:54.040 回答
3

试试这个:

if [[ $id =~ [0-9]{9} ]]; then

看起来 bash 无法识别\d[0-9].

Bash 使用不支持的扩展正则表达式方言\d

根据 ERE 的语法(词汇约定),转义字符的形式为\SPEC_CHAR. SPEC_CHAR可以是以下任何一项:

^    .    [    $    (    )    |
*    +    ?    {    \
于 2011-09-15T23:32:42.610 回答
-2

问题是 \d 在被解释之前变成了 d 。尝试双重转义。

\d{9} => d{9}
\\d{9} => \d{9}

或者,您可以将其放在引号中

if [[ $id =~ "\d{9}" ]]
于 2011-09-15T23:56:12.260 回答