简单的Bash和RegEx问题

时间:2011-09-15 23:21:26

标签: regex bash bash4

我无法在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 个答案:

答案 0 :(得分:9)

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

^[0-9]{9}$

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

答案 1 :(得分:8)

  

这样可行: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:]

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

问题是[[:digit:]] 有效。我已经在许多Bash shell脚本中使用它,认为它相当普遍。但是,如果你有一个不起作用的BASH shell,我将不得不停止使用它。

答案 2 :(得分:3)

试试这个:

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

bash似乎无法将\d识别为[0-9]

Bash uses Extended Regular Expression dialect,不支持\d

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

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

答案 3 :(得分:-2)

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

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

或者,你可以把它放在引号

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