O terdon corrigiu sua sintaxe, mas sua expressão regular está errada:
[0-9]*\.?[0-9]*
Todos os quantificadores ( *
, ?
) significam que todas as partes da expressão são opcionais. Isso significa que seu regex corresponderá a todas as strings, incluindo strings vazias e strings que não tenham dígitos.
Para corresponder a um número flutuante, você precisa corresponder a pelo menos um dígito.
([0-9]+\.?[0-9]*)|([0-9]*\.[0-9]+)
Corresponde a alguns dígitos com um ponto decimal opcional e dígitos opcionais (exemplo: 3,14 ou 42), ou alguns dígitos opcionais, mas um ponto decimal obrigatório e dígitos obrigatórios (exemplo: .1234 ou 3.14).
Não está ancorado, por isso a cadeia "PI começa com 3.14 e continua" corresponderá.
Teste:
for n in "" "no digits" 42 3.14 "this is .1234 go"; do
if [[ $n =~ ([0-9]+\.?[0-9]*)|([0-9]*\.[0-9]+) ]]; then
echo "yes -- $n -- ${BASH_REMATCH[0]}"
fi
done
yes -- 42 -- 42
yes -- 3.14 -- 3.14
yes -- this is .1234 go -- .1234