bash中的正则表达式仅在键入参数时接受,但在复制粘贴它时不接受

时间:2016-03-03 13:45:11

标签: regex bash

我在我的bash脚本中写了一个小帮助函数来验证用户输入脚本的票号作为参数

票号结构必须如下:TICKET + 7位数,例如TICKET1234567

问题是,一旦用户键入了票号,只有在我手动键入它时才接受正则表达式,但如果我从记事本或任何其他文本编辑器复制并粘贴它,则正则表达式比较失败,退出状态为1

注意:如果粘贴票号和echo $TICKET,我会看到正确的票号。

这是功能:

#helper to check TICKET  number structure
ticket_helper (){
    [[ $TICKET =~ '^TICKET[0-9]{7}$' ]]
    ES=$?
    if  [[  $ES -ne 0  ]];then
        echo  "Error:Please enter a valid TICKET number"
        exit 1
    fi
}

#requests user to enter TICKET number
read -p "Please Ticket Number "   TICKET
ticket_helper

如何从编辑器粘贴函数时让函数接受票号?

2 个答案:

答案 0 :(得分:2)

从模式中删除周围的引号。

替换:

[[ $TICKET =~ '^TICKET[0-9]{7}$' ]]

with:

[[ $TICKET =~ ^TICKET[0-9]{7}$ ]]

使用引号,该模式强制匹配为字符串 (来自https://www.gnu.org/software/bash/manual/html_node/Conditional-Constructs.html

答案 1 :(得分:1)

由于单引号,您的正则表达式按字面解释。最好在变量中的条件运算符之外定义它。

使用小写变量名称而不是大写变量名称也是一种好习惯,因为它们不太可能与现有(环境)变量冲突。

您可以直接使用条件而不是检查退出状态:

ticket_helper () {
    local re='^TICKET[0-9]{7}$'
    if [[ ! $ticket =~ $re ]]; then
        echo  "Error:Please enter a valid TICKET number"
        exit 1
    fi
}