Проверка правильности адреса электронной почты с регулярным выражением в Bash

Я пытаюсь сделать сценарий 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

И это - мой сценарий удара:

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 в замене одинарной левой кавычки

Какая-либо подсказка??

6
задан Mateusz Piotrowski 2 September 2016 в 10:05
поделиться

4 ответа

У вас есть несколько проблем:

  • Регулярное выражение должно быть указано, и специальные символы сбежали.
  • Регулярное выражение должно быть закреплено ( ^ и $ ).
  • ?: не поддерживается и необходимо удалить.
  • Вам нужны пробелы вокруг оператора = ~ .

Окончательный продукт:

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
9
ответ дан 8 December 2019 в 05:55
поделиться

Вам не нужно создавать такое сложное регулярное выражение, чтобы проверить действительное электронное письмо. Вы можете просто разделить на «@», а затем проверьте, есть ли 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"

Чтобы проверить домен далее, вы можете использовать такие инструменты, как ROG, чтобы запросить домен. Это лучше, чем Regex, потому что @ New.jersey соответствует Regex, но это на самом деле не является правильным доменом.

7
ответ дан 8 December 2019 в 05:55
поделиться

Кавычки, обратные ссылки и другие являются специальными символами в скриптах оболочки и должны быть экранированы, если они используются, как в присвоении regex. Вы можете экранировать специальные символы обратным слешем или использовать одинарные кавычки вокруг регекса, если вы пропустите единственную кавычку, используемую в нем.

Я бы порекомендовал использовать более простые регулярные выражения, такие как .*@.*, так как вся их сложность бесполезна. foo@example.com выглядит прекрасно и будет принято любое регулярное выражение, но все равно его не существует.

5
ответ дан 8 December 2019 в 05:55
поделиться

Непосредственная проблема с вашим сценарием необходимо исправить цитирование:

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, запустите SendMail -Oi -T и напишите сообщение стандартному входу процесса SendMail, E.g. ,

To: test@terra.es.invalid
From: no-reply@your.organization.invalid
Subject: email address confirmation

To confirm your address, please visit the following link:

http://www.your.organization.invalid/verify/1a456fadef213443
0
ответ дан 8 December 2019 в 05:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: