Bash正则表达式需要匹配始终格式相同的字符串

时间:2013-09-12 17:24:09

标签: regex bash

我正在编写一个需要验证用户输入的脚本。 系统会提示用户输入始终格式相同的票号:

HD0000000000000

这是大写高清,后跟13位数。

我需要在脚本继续之前验证输入,否则可能会在以后填充。

到目前为止,我有:

read -p 'Please enter the Helpdesk Ticket Number: ' TICKET
if [[ $TICKET =~ HD[\d]{13} ]] ; then
    echo "This ticket number seems to be valid. Be sure to double check!"
else
    echo "This ticket number does not seem to be valid! Be sure to double check!"
fi

但无论我在提示时放入什么,它都不匹配。

我最初匹配

HD[0-9]{13}

但即使我输入一封小写字母,也会传递给我的任何内容。

我做错了什么?任何事情都会有所帮助!

这个脚本必须只使用bash builtins,因为它可能在许多具有不同util set的不同机器上运行。 我正在开发bash 3.00,但这必须在bash 2.00 - 3.60

上运行

谢谢!

3 个答案:

答案 0 :(得分:4)

正则表达式匹配在2.05b中不起作用。如果你想让它更兼容,你可以使用这种格式:

#!/bin/bash

read -p 'Please enter the Helpdesk Ticket Number: ' TICKET

if [[ $TICKET == HD[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] ]] ; then
    echo "This ticket number seems to be valid. Be sure to double check!"
else
    echo "This ticket number does not seem to be valid! Be sure to double check!"
fi

更多地使用与POSIX兼容的case

#!/bin/bash

read -p 'Please enter the Helpdesk Ticket Number: ' TICKET

case $TICKET in
HD[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9])
    echo "This ticket number seems to be valid. Be sure to double check!"
    ;;
*)
    echo "This ticket number does not seem to be valid! Be sure to double check!"
    ;;
esac

答案 1 :(得分:1)

在bash中使用此正则表达式:

 ^HD[0-9]{13}$

bash regex引擎不支持数字\d

答案 2 :(得分:0)

^HD[0-9]{13}$

Regular expression visualization

Edit live on Debuggex

确保您有一个起始行^和结束行$