BASH如果输入比较以强制使用有效的电子邮件地址格式

时间:2011-06-29 16:53:25

标签: bash

我有一个useradd bash脚本,它要求用户输入正在创建的用户的电子邮件地址。这样,用户在创建他/她的帐户时会在电子邮件中收到他的用户名/密码。

目前这部分代码非常简单:

echo Enter the users e-mail address
read ADDRESS

我发现有时当操作员运行脚本时,他们会输入空白信息。如何使用if语句强制它们输入电子邮件地址格式。

我尝试了以下代码,但它不起作用。我们的想法是至少验证他们正在使用@符号。

if [[ $string != "@" ]] ; then
    echo You have entered an invalid e-mail address!
    exit 1
else
    # do something
fi

4 个答案:

答案 0 :(得分:3)

如果您只是寻找快速和脏的东西,这个bash条件表达式将匹配至少有一个char,一个'@',至少一个char,一个点和至少一个char的东西。

[[ "$email" == ?*@?*.?* ]] 

实施例

$ [[ "a@b.c" == ?*@?*.?* ]] && echo Y || echo n
Y
$ [[ "foo@bar" == ?*@?*.?* ]] && echo Y || echo n
n

实际的电子邮件验证非常粗略(请参阅here

答案 1 :(得分:1)

!=测试确切的不等式:字符串必须与@完全相同。有两种方法可以进行你想要的测试

case "$string" in
*@*)
    ;;
*)
    echo You have entered an invalid email address! >&2
    exit 1
    ;;
esac

if ! expr "$string" : '.*@' >/dev/null; then
    echo You have entered an invalid email address! >&2
    exit 1
fi

您需要重定向expr的结果,因为它会打印匹配的长度。另请注意,case使用shell globs,而expr使用POSIX基本正则表达式(因此您无法使用+?等);并且你需要引用传递给expr的正则表达式,这样shell就不会展开它,但对case来说,重点是让shell扩展它。

我通常更喜欢case,除非我真的需要正则表达式。

答案 2 :(得分:0)

你可以,例如使用bash的{​​{1}}运算符,例如:

=~

答案 3 :(得分:0)

您可以在bash中使用if条件中的glob样式模式:

if [[ $string != *"@"* ]] ; then
    echo You have entered an invalid e-mail address!
    exit 1
else
    # do something
fi

我更进一步,要求@两侧至少有一个角色:

if [[ $string != *?"@"?* ]] ; then
    echo You have entered an invalid e-mail address!
    exit 1
else
    : # do something
fi