bal*_*tud 6 regex bash shell email-validation
我正在尝试制作一个Bash脚本来检查电子邮件地址是否正确.
我有这个正则表达式:
[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?
Run Code Online (Sandbox Code Playgroud)
资料来源:http://www.regular-expressions.info/email.html
这是我的bash脚本:
regex=[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?
i="test@terra.es"
if [[ $i=~$regex ]] ; then
echo "OK"
else
echo "not OK"
fi
Run Code Online (Sandbox Code Playgroud)
脚本失败并给我输出:
10:语法错误:反引号替换中的EOF
任何线索?
你有几个问题:
^
和$
).?:
不受支持,需要删除.=~
操作员周围留出空间.最终产品:
regex="^[a-z0-9!#\$%&'*+/=?^_\`{|}~-]+(\.[a-z0-9!#$%&'*+/=?^_\`{|}~-]+)*@([a-z0-9]([a-z0-9-]*[a-z0-9])?\.)+[a-z0-9]([a-z0-9-]*[a-z0-9])?\$"
i="test@terra.es"
if [[ $i =~ $regex ]] ; then
echo "OK"
else
echo "not OK"
fi
Run Code Online (Sandbox Code Playgroud)
您不必创建这样复杂的正则表达式来检查有效的电子邮件.您可以简单地拆分"@",然后检查是否有2个项目,一个位于@前面,另一个位于后面.
i="test@terraes"
IFS="@"
set -- $i
if [ "${#@}" -ne 2 ];then
echo "invalid email"
fi
domain="$2"
dig $domain | grep "ANSWER: 0" 1>/dev/null && echo "domain not ok"
Run Code Online (Sandbox Code Playgroud)
要进一步检查域,您可以使用dig之类的工具来查询域.它比正则表达式更好,因为@ new.jersey与正则表达式匹配,但它实际上不是一个合适的域.
引号,反引号和其他是shell脚本中的特殊字符,如果像分配中那样使用它们,则需要进行转义regex
.您可以使用反斜杠转义特殊字符,或者如果省略其中使用的单引号,则在正则表达式周围使用单引号.
我建议使用更简单的正则表达式,.*@.*
因为所有的复杂性都是徒劳的.foo@example.com
看起来非常好,任何正则表达式都会接受它,但它仍然不存在.