我有一个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
答案 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