8

メールアドレスが正しいかどうかを確認するための 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])?

ソース: 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

スクリプトは失敗し、次の出力が表示されます。

10: 構文エラー: バッククォート置換の EOF

どんな手掛かり??

4

8 に答える 8

13

ここにはいくつかの問題があります。

  • 正規表現は引用符で囲み、特殊文字をエスケープする必要があります。
  • 正規表現は固定する必要があります(^および$)。
  • ?:サポートされていないため、削除する必要があります。
  • =~演算子の周りにスペースが必要です。

最終製品:

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
于 2010-01-26T10:45:17.283 に答える
10

有効なメールをチェックするために、このような複雑な正規表現を作成する必要はありません。「@」で分割して、@の前と後ろの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"

ドメインをさらに確認するには、digなどのツールを使用してドメインを照会できます。@ new.jerseyは正規表現と一致するため、正規表現よりも優れていますが、実際には適切なドメインではありません。

于 2010-01-26T10:46:07.127 に答える
5

引用符、バッククォートなどはシェル スクリプトの特殊文字であり、regex. バックスラッシュで特殊文字をエスケープするか、単一引用符を使用しない場合は正規表現を単一引用符で囲みます。

.*@.*すべての複雑さが無駄なので、より単純な正規表現を使用することをお勧めします。foo@example.com完全に問題ないように見え、どの正規表現でも受け入れられますが、それでも存在しません。

于 2010-01-26T10:16:53.657 に答える
1

3.2 未満の Bash バージョン:

if [[ "$email" =~ "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$" ]]
then
    echo "Email address $email is valid."
else
    echo "Email address $email is invalid."
fi

3.2 以上の Bash バージョン:

if [[ "$email" =~ ^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$ ]]
then
    echo "Email address $email is valid."
else
    echo "Email address $email is invalid."
fi

あなたが持っているように、非常に具体的な正規表現を使用すべきではない理由は、ここで説明されています。

于 2011-04-19T16:25:09.690 に答える
0

狂気の瞬間に、Mastering Regular Expressions book に基づいて、この Perl サブルーチンを書きました。

sub getRFC822AddressSpec
{
    my ($esc, $space, $tab, $period) = ('\\\\', '\040', '\t', '\.');
    my ($lBr, $rBr, $lPa, $rPa)      = ('\[', '\]', '\(', '\)');
    my ($nonAscii, $ctrl, $CRlist)   = ('\200-\377', '\000-\037', '\n\015');

    my $qtext       = qq{ [^$esc$nonAscii$CRlist] }; # within "..."
    my $dtext       = qq{ [^$esc$nonAscii$CRlist$lBr$rBr] }; # within [...]
    my $ctext       = qq{ [^$esc$nonAscii$CRlist()] }; # within (...)
    my $quoted_pair = qq{ $esc [^$nonAscii] }; # an escaped char
    my $atom_char   = qq{ [^()$space<>\@,;:".$esc$lBr$rBr$ctrl$nonAscii] };
    my $atom        = qq{ $atom_char+     # some atom chars
                          (?!$atom_char)  # NOT followed by part of an atom
                        };
    # rfc822 comments are (enclosed (in parentheses) like this)
    my $cNested     = qq{ $lPa (?: $ctext | $quoted_pair )* $rPa };
    my $comment     = qq{ $lPa (?: $ctext | $quoted_pair | $cNested )* $rPa };

    # whitespace and comments may be scattered liberally
    my $X           = qq{ (?: [$space$tab] | $comment )* };

    my $quoted_str  = qq{ " (?: $qtext | $quoted_pair )* " };
    my $word        = qq{ (?: $atom | $quoted_str ) };
    my $domain_ref  = $atom;
    my $domain_lit  = qq{ $lBr (?: $dtext | $quoted_pair )* $rBr };
    my $sub_domain  = qq{ (?: $domain_ref | $domain_lit ) };
    my $domain      = qq{ $sub_domain (?: $X $period $X $sub_domain )* };
    my $local_part  = qq{ $word (?: $X $period $X $word )* };
    my $addr_spec   = qq{ $local_part $X \@ $X $domain };

    # return a regular expression object
    return qr{$addr_spec}ox;
}

my $spec = getRFC822AddressSpec();
my $address = q{foo (Mr. John Foo) @ bar. example};
print "$address is an email address" if ($address =~ qr{$spec});
于 2011-04-19T16:53:35.927 に答える
0

スクリプトの差し迫った問題は、引用を修正する必要があることです。

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])?'

ただし、この正規表現は、構文的に有効なすべての電子メール アドレスを受け入れるわけではありません。配信できたとしても、構文的に有効なすべての電子メール アドレスが配信可能であるとは限りません。

配信可能なアドレスが重要な場合は、正規表現やその他の構文チェック手段に煩わされる必要はありません。ユーザーが指定したアドレスにチャレンジを送信してください。コマンド呼び出しの一部として信頼できない入力を使用しないように注意してください。sendmail を使用して、 sendmailsendmail -oi -tプロセスの標準入力にメッセージを実行して書き込みます。

宛先: test@terra.es.invalid
From: no-reply@your.organization.invalid
件名:メールアドレス確認

住所を確認するには、次のリンクにアクセスしてください。

http://www.your.organization.invalid/verify/1a456fadef213443
于 2010-01-26T14:33:47.743 に答える
0

上記の例を調整して、正規表現でアドレスの有効性をチェックし、dig でドメインが実際に存在するかどうかをチェックし、存在しない場合はエラーを返す独自の関数を持たせました。

#!/bin/bash
#Regexp
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])?\$"

#Vars
checkdig=0;
checkreg=0;
address=$1;
maildomain=`echo $address | awk 'BEGIN { FS = "@" } ; { print $2 }'`;

#Domain Check
checkdns() {
        echo $maildomain | awk 'BEGIN { FS = "@" } ; { print $2 }' | xargs dig $maildomain | grep "ANSWER: 0" 1>/dev/null  || checkdig=1;
}

#Regexp
checkreg() {
        if [[ $address =~ $regex ]] ;
                then checkreg=1;
        fi
}

#Execute
checkreg;
checkdns;

#Results
if [ $checkreg == 1 ] && [ $checkdig == 1 ];
        then    echo "OK";
        else    echo "not OK";
fi
#End

特にない。

于 2014-03-27T13:56:56.647 に答える
0

パーティーに遅刻しましたが、メールを含むファイルを読み取り、RFC822 正規表現、ドメイン タイポ リスト、mx ルックアップ (ここでは eagle1 に感謝)、あいまいなメール フィルタリングを使用してフィルタリングするようにスクリプトを調整しました。

スクリプトは次のように使用できます。

./emailCheck.sh /path/to/emailList

フィルタリングされたリストとあいまいなリストの 2 つのファイルが生成されます。どちらも、RFC822 に準拠していないアドレス、有効な MX ドメインを持たない電子メール ドメイン、およびドメイン タイプミスからすでにクリアされています。

スクリプトはここにあります: https://github.com/deajan/linuxscripts

訂正とコメントは大歓迎です:)

于 2016-03-30T10:42:46.427 に答える