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,您的初始版本没有这样做。
我正准备在 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,您的初始版本没有这样做。