#!/usr/bin/env bash valid_inputs=( "v@example.com" "v@e.com" "v@e.me" "valid@123.com" "valid@example.com" "vali.d@example.com" "va-lid@example.com" "v-a-l-i-d@example.com" "v.a-lid@example.com" "v.ali-d@example.com" "v_ali-d@example.com" "va_li-d@example.com" "v_a_li_d@example.com" "v.ali-d@example.com" "v.ali.d@example.com" "v0.ali.d@example.com" "v0.ali.d1@example.com" "valid@e-x_ample.com" "valid@e.x-ample.c.om" "v.alid@e.xample.c.a.tw" "v.a.lid@e.xample.c.a.tw" "v.a+lid@e.xample.c.a.tw" "valid@e.xample.c.a.tw" "valid+alias@example.com" "valid01@example.com" "valid-01@example.com" "valid_01@example.com" "valid.01@example.com" "va-lid-0-1@example.com" "va.lid-0-1@example.com" "val-id.0-1@example.com" ) invalid_inputs=( "-invalid@example.com" ".invalid@example.com" "_invalid@example.com" "inv alid@example.com" "invalid@exa mple.com" "inv.-alid@example.com" "inv-.-alid@example.com" "invali-.-d@example.com" "inval..id@example.com" "inva--lid@example.com" "inval_-id@example.com" "inval-.id@example.com" "invalid.@example.com" "invalid_@example.com" "invalid-@example.com" "0.invali.d@example.com" "0.invali.1@example.com" "invalid@_" "invalid@com" "invalid@example.c-.om" "invalid@example._com" "invalid@e-x._ample.com" "invalid@e-.x_ample.com" "invalid@e.-x_ample.com" "invalid@example.c" "invalid@example._" "invalid@exampl.0e" "invalid@exampl.e1" "invalid@exampl.1" "invalid@example." "invalid@example.com." "invalid++alias@example.com" "invalid+1+alias@example.com" "invalid+alias+user@example.com" "invalid+xyz+alias@example.com" "+alias@example.com" "invalid@-.com" "invalid@.com" "invalid@com" "@" ".@." "-@-" "_@_" "+@+" "a.@.." "@com" "@example.com" "_@example.com" ".@example.com" "invalid@_123.com" "invalid@example.123" "invalid@example.123.456" ) regex="^([A-Za-z]+((\.|\-|\_)?[A-Za-z0-9])*\+?((\.|\-|\_)?[A-Za-z]+[A-Za-z0-9]*)*)@(([A-Za-z0-9]+)+((\.|\-|\_)?([A-Za-z0-9]+)+)*)+\.([A-Za-z]{2,})+$" function validator { if [[ $1 =~ ${regex} ]]; then printf "* %-48s \e[1;32m[pass]\e[m\n" "${1}" else printf "* %-48s \e[1;31m[fail]\e[m\n" "${1}" fi } cat <<-EOF a simple email validator in shell online validator: http://emailregex.com/ RFC: http://emailregex.com/email-validation-summary/ EOF echo echo "### expected result: valid" echo for input in "${valid_inputs[@]}"; do validator "${input}" done echo echo "### expected result: invalid" echo for input in "${invalid_inputs[@]}"; do validator "${input}" done