简单的Bash和RegEx问题

Gra*_*ace 8 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
Run Code Online (Sandbox Code Playgroud)

然后调用脚本:

 ./script 987654321
Run Code Online (Sandbox Code Playgroud)

显而易见的是我错过了什么?

ste*_*ema 9

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

^[0-9]{9}$
Run Code Online (Sandbox Code Playgroud)

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


Dav*_* W. 8

这将有效:如果[[$ id =〜[[:digit:]] {9}]] - 大卫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
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

DaveBook:~ david$ ./test.sh
123456789 is 9 digits long
12345689 is bad
1234567890 is bad
987654321 is 9 digits long
DaveBook:~ david$ 
Run Code Online (Sandbox Code Playgroud)

我正在使用BASH 3.2.48用于Mac OS X和Bash 4.1.10(4)用于Cygwin(哇,Mac版本是那么老?).我没有在Linux机器上测试过这个.

你用的是什么版本?你把方括号加倍了:digit:吗?它必须是,[[:digit:]]而不是[:digit:].

我也意识到我需要^$那里的锚,因为你不想匹配foo123456789bar1234567890123456790.这是你的问题吗?

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