Я пытаюсь сделать сценарий 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 в замене одинарной левой кавычки
Какая-либо подсказка??
У вас есть несколько проблем:
^
и $
). ?:
не поддерживается и необходимо удалить. = ~
. Окончательный продукт:
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
Вам не нужно создавать такое сложное регулярное выражение, чтобы проверить действительное электронное письмо. Вы можете просто разделить на «@», а затем проверьте, есть ли 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, но это на самом деле не является правильным доменом.
Кавычки, обратные ссылки и другие являются специальными символами в скриптах оболочки и должны быть экранированы, если они используются, как в присвоении regex
. Вы можете экранировать специальные символы обратным слешем или использовать одинарные кавычки вокруг регекса, если вы пропустите единственную кавычку, используемую в нем.
Я бы порекомендовал использовать более простые регулярные выражения, такие как .*@.*
, так как вся их сложность бесполезна. foo@example.com
выглядит прекрасно и будет принято любое регулярное выражение, но все равно его не существует.
Непосредственная проблема с вашим сценарием необходимо исправить цитирование:
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