bash 正则表达式电子邮件

bash regex email

我正准备在 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

我不明白为什么不起作用。

主要问题在于您似乎正在为 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,您的初始版本没有这样做。