Shell 如何在unix脚本中检查特定字符串之间的字符串?

Shell 如何在unix脚本中检查特定字符串之间的字符串?,shell,unix,Shell,Unix,字符串: 检查: name@gmail.com 我的代码 @ .com 我的问题 if [[ $word =~ "@" ]] then if [[ $word =~ ".com" || $word =~ ".ca" ]] 上面的例子通过了,这不是我想要的。如何检查“@”和“.com”之间的字符(1个或更多)?您可以使用非常基本的正则表达式: name@.com 它查找的字符串与以下内容完全相同: [[ $var =~ ^[a-z]+@[a-z]+\.[a-z]+$ ]]

字符串:

检查:

name@gmail.com
我的代码

@
.com
我的问题

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

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

您可以使用非常基本的正则表达式:

name@.com
它查找的字符串与以下内容完全相同:

[[ $var =~ ^[a-z]+@[a-z]+\.[a-z]+$ ]]
它可以变得复杂到你想要的程度,例如,参见

见效
为什么不使用其他工具,如perl:

$ var="a@b.com"

$ [[ $var =~ ^[a-z]+@[a-z]+\.[a-z]+$ ]] && echo "kind of valid email"
kind of valid email

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

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

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

@(p1 | p2 | p3 |…)
是与给定模式之一匹配的。这需要:
shopt-s extglob

测试:

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

对不起,你能进一步解释吗?我不明白^[a-z]@[a-z].[a-z]在做什么。括号外的&&正在做什么请使用
\.
匹配文字
@Dan当然,只要用正确的解释更新我的答案。
[[condition]]&&echo“hello”
[[]]
为真的情况下执行
echo
。因此,通过这种方式,您可以检查是否正在输入
if
条件。
> echo "x@gmail.com" | perl -lne 'print $1 if(/@(.*?)\.com/)'
gmail
$ 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