【问题标题】:bash regex emailbash 正则表达式电子邮件
【发布时间】:2015-08-29 22:07:58
【问题描述】:

我正在尝试以交互方式在 bash 中询问电子邮件地址,直到它获得有效的电子邮件地址。这是代码。

#!/bin/bash
email=""
email_status=[ "$email" =~ ^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$ ]
while [ $email_status ]
do
    read -p "Enter admin email: " email
    echo
    if [[ "$email" =~ ^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$ ]]
    then
        echo "Email address $email is valid."
    else
        echo "Email address $email is invalid."
    fi
done

我不明白为什么不工作。

【问题讨论】:

    标签: regex bash validation email interactive


    【解决方案1】:

    主要问题在于您似乎正在为while 循环的初始条件设置条件的部分。我们可以通过在所需条件下退出循环来简化整个循环,例如:

    #!/bin/bash
    
    while true
    do
        read -p "Enter admin email: " email
        echo
        if [[ "$email" =~ ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$ ]]
        then
            echo "Email address $email is valid."
            break
        else
            echo "Email address $email is invalid."
        fi
    done
    

    我还对其进行了修改以接受小写字符。

    那么为什么初始版本你没有工作?对于初学者,您实际上并没有执行您想要的命令。该命令将首先使用 = 分配进行解析,就像您为要执行的其余命令分配一个本地 shell 变量一样。所以在这种情况下,您将[ 分配给email_status,然后尝试执行"$email" =~ ^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$ ],这不是一个真正的命令。

    即使是这样,您的分配仍然无法工作,因为您真正想要的(除了使用 [[ 以便您可以使用正则表达式语法之外)是进行该测试,然后存储退出代码在exit_status 喜欢:

    [[ "$email" =~ ^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$ ]]
    email_status=$?
    

    然后确保在循环中更新 email_status,而您的初始版本没有这样做。

    【讨论】:

    • 非常感谢!!!我不能投票给你,因为我没有达到 15 分,当我到达那里时我会这样做!!!!谢谢
    • 稍微干净的正则表达式 [[ $email =~ ^[[:alnum:]._%+-]+@[[:alnum:].-]+\.[[:alpha:] .]{2,4}$ ]]
    猜你喜欢
    • 1970-01-01
    • 2011-12-28
    • 2012-01-02
    • 2015-12-03
    • 2016-11-30
    • 1970-01-01
    相关资源
    最近更新 更多