我无法在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
显而易见的是我失踪了吗?
答案 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:]
。
我还意识到我需要^
和$
锚点,因为您不想匹配foo123456789bar
或1234567890123456790
。这是你的问题吗?
问题是[[: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_CHAR
。 SPEC_CHAR
可以是以下任何一种:
^ . [ $ ( ) |
* + ? { \
答案 3 :(得分:-2)
问题是\ d在解释之前变成d。尝试双重转义。
\d{9} => d{9}
\\d{9} => \d{9}
或者,你可以把它放在引号
中if [[ $id =~ "\d{9}" ]]