如何检查unix脚本中的某些string之间的string?

串:

name@gmail.com 

检查:

 @ .com 

我的代码

 if [[ $word =~ "@" ]] then if [[ $word =~ ".com" || $word =~ ".ca" ]] 

我的问题

 name@.com 

上面的例子通过了,这不是我想要的。 如何检查“@”和“.com”之间的字符(1或更多)?

你可以使用一个非常非常基本的正则表达式:

 [[ $var =~ ^[az]+@[az]+\.[az]+$ ]] 

它看起来像这样的字符串:

 at least one az char @ at least one az char . at least one az char 

它可以得到像你想要的复杂,例如看电子邮件检查正则表达式与bash脚本 。

见行动

 $ var="a@b.com" $ [[ $var =~ ^[az]+@[az]+\.[az]+$ ]] && echo "kind of valid email" kind of valid email $ var="a@.com" $ [[ $var =~ ^[az]+@[az]+\.[az]+$ ]] && echo "kind of valid email" $ 

为什么不去像Perl的其他工具:

 > echo "x@gmail.com" | perl -lne 'print $1 if(/@(.*?)\.com/)' gmail 

glob模式是: [[ $word == ?*@?*.@(com|ca) ]]

? 匹配任何单个字符, *匹配零个或多个字符

@(p1|p2|p3|...)是与给定模式匹配的扩展匹配模式。 这要求:
shopt -s extglob

测试:

 $ for word in @.com @a.ca a@.com a@b.ca a@b.org; do echo -ne "$word\t" [[ $word == ?*@?*.@(com|ca) ]] && echo matches || echo does not match done @.com does not match @a.ca does not match a@.com does not match a@b.ca matches a@b.org does not match