Este código bash
lê entrada e sinaliza "Pass" se a entrada contiver um símbolo @
:
read -p "Input: " var
[ "${var//[^@]/}" ] && echo Pass || echo Fail
Notas:
-
[ "$var" ]
é um teste bash. Retorna true se a string$var
não estiver vazia. -
Um dos recursos do bash é a substituição de padrões. Parece com
${var//pattern/string}
. Ele substitui todas as ocorrências depattern
emvar
porstring
. No nosso caso,pattern
é[^@]
, que é uma expressão regular que corresponde a todos os caracteres exceto@
. Assim,${var//[^@]/}
retorna uma string vazia, a menos quevar
contenha pelo menos um@
. -
Combinamos os dois acima:
[ "${var//[^@]/}" ]
Este teste é bem-sucedido apenas se
${var//[^@]/}
não estiver vazio e${var//[^@]/}
não estiver vazio sevar
contiver pelo menos um@
.
Usando um explícito if-then-else:
read -p "Input: " var
if [ "${var//[^@]/}" ]
then
echo Pass
else
echo Fail
fi
Shell POSIX
O seguinte funciona em dash
( /bin/sh
) e deve funcionar em qualquer shell POSIX:
printf "Input: "
read var
case "$var" in
*@*) echo Pass
;;
*) echo Fail
;;
esac
O shell POSIX não suporta a opção -p
para read
. Então, uma combinação de printf
e read
é usada no lugar. Além disso, faltando recursos avançados de expansão de variáveis de bash
, a instrução case
pode ser usada para correspondência glob.
Shell Android
Usando o shell padrão no meu android, o seguinte funciona:
echo -n "Input: "; read var
if ! [ "${var//@/}" = "$var" ]
then
echo Pass
else
echo Fail