我无法在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)
显而易见的是我错过了什么?
正如其他人已经回答你应该使用[0-9]{9}因为\d不受支持.但另一个重要的部分是,你必须使用锚!
^[0-9]{9}$
Run Code Online (Sandbox Code Playgroud)
将^正则表达式锚定到字符串的开头并将其$锚定到结尾.如果你不使用它们,你的正则表达式将匹配序列中包含9位数的每个字符串,如"abc123456789","asdf123456789zui"或"123456789FOOBAR".
这将有效:如果[[$ 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:].
我也意识到我需要^和$那里的锚,因为你不想匹配foo123456789bar或1234567890123456790.这是你的问题吗?
问题[[:digit:]] 应该是有效的.我已经在许多Bash shell脚本中使用它,认为它相当普遍.但是,如果你有一个不起作用的BASH shell,我将不得不停止使用它.
| 归档时间: |
|
| 查看次数: |
13218 次 |
| 最近记录: |