Geralmente quando validava uma sequência de caracteres em shell script usando uma expressão regular eu recorria a uma ferramenta externa (egrep, sed etc) para fazê-lo — algo como neste exemplo de validação de endereços de e-mail utilizando o egrep:
$ echo "usuario@email.com" |\ egrep "[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$" >/dev/null ; echo $? 0 $ echo "usuario%email-123" |\ egrep "[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$" >/dev/null ; echo $? 1
Ou seja, o retorno do valor 0 para significando verdadeiro e do valor 1 indicando falso.
Mas acontece que o Bash tem suporte nativo a expressões regulares, algo que acelera consideravelmente estas validações já que não há a necessidade de se executar um programa externo.
Basta utilizar os colchetes duplos e o operador “=~” para a validação:
$ [[ "usuario@email.com" =~ [a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$ ]] ; echo $? 0 $ $ [[ "usuario%email-123" =~ [a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$ ]] ; echo $? 1
Os valores de retorno são idênticos — o valor 0 ainda é verdadeiro e valor 1 ainda é falso — e o código resultante ainda fica mais legível. E para ajudar a fixar este mesmo exemplo na forma de um script completo:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
email_REGEX="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$" | |
email_to_check=${1} | |
if [ -z "${email_to_check}" ]; then | |
echo "É necessário inserir um endereço de e-mail!" | |
exit 2 | |
else | |
if [[ "${email_to_check}" =~ ${email_REGEX} ]]; then | |
echo "O endereço '${email_to_check}' é válido!" | |
else | |
echo "O endereço '${email_to_check}' não é válido!" | |
exit 1 | |
fi | |
fi | |
exit 0 |
Só um detalhe, isto só funcionará com o Bash, o “/bin/bash”, e não com o o Dash, que em algumas distribuições responde como “/bin/sh” ao invés do Bash. Portanto preste atenção a este pequeno detalhe.
Primeiramente parabéns por mostrar esse tipo de coisa, que não deve ser muito usado justamente por não ser conhecido. Eu sou um exemplo, apesar de já ter visto algumas vezes isso, eu sempre uso o egrep, sed, etc. e eu não tenho desculpa, pois sempre uso o bash como shell.
Agora uma reclamação, sobre o exemplo dado, sei que ele se destina a mostrar a funcionalidade, mas não posso deixar de achar ruim e classificar como um mal costume fazer esse tipo de restrição ao e-mail. Tanto e-mail quanto nome de domínio, podem ser escritos com letras maiúsculas e minúsculas, e eu não gosto de informar meu e-mail em diversos formulários pela web afora e perder tempo lendo mensagens de erro por conta de que sempre escrevo alguns caracteres em caixa alta, coisa que melhora enormemente a visualização do e-mail.
Além da reclamação acima, que não foi necessariamente direcionada ao autor do post, mas visando sobretudo aos leitores, para que a informação seja disseminada e que eles lembrem disso, caso venham a fazer formulários ou programas que pedem para que se digite o e-mail, eu tenho uma má notícia para quem quer validar um e-mail ou mesmo nome de domínio. Faz tempo que é possível usar os diversos caracteres Unicode (não sei se todos) nesses nomes. Assim validar um e-mail digitado por um usuário pode requerer passos adicionais, como verificar o IDN (ao menos do nome de domínio).
Por exemplo, a URL:
http://www.CriançaEsperança.com.br/
é perfeitamente válida, tanto é que é real, basta clicar para acessar. Sendo também possível que o responsável pelo domínio acima possa criar um e-mail como Ação@CriançaEsperança.com.br (esse “Ação” foi só para exemplificar não deve existir mas é possível de ser criado).
CurtirCurtir
No bash para nosso LOCALE a expressão regular fornecida pelo autor é suficiente para acentuação:
$ echo “UsuárioComAcentuação@email.com” | egrep “[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$” >/dev/null ; echo $?
0
Porém, se você quiser ser mais rigoroso, recomendo a regex abaixo.
$ echo -n “ßÇçãÃáÁÀàüÜíÍóÓúÚõÕéÉèÈëËöÖ@email.com” | egrep ‘[[:alnum:]\._%+-]*+@[[:alnum:]\.-]+\.[[:alpha:]]{2,4}$’ >/dev/null ; echo $?
0
CurtirCurtir
Pingback: Arrays em Bash | giovannireisnunes
Pingback: Manipulação de strings em Bash | giovannireisnunes
Pingback: Expressões regulares, o básico – parte 3 | giovannireisnunes