Uma resposta clara já foi dada por @charles Dufy e outros. Uma solução pura do bash usaria o seguinte:
string="-12,345"
if [[ "$string" =~ ^-?[0-9]+[.,]?[0-9]*$ ]]
then
echo $string is a number
else
echo $string is not a number
fi
Embora para números reais não seja obrigatório ter um número antes do ponto de raiz .
Para fornecer um suporte mais completo aos números flutuantes e à notação científica (muitos programas em C / Fortran, ou então exportarão float dessa maneira), uma adição útil a esta linha seria a seguinte:
string="1.2345E-67"
if [[ "$string" =~ ^-?[0-9]*[.,]?[0-9]*[eE]?-?[0-9]+$ ]]
then
echo $string is a number
else
echo $string is not a number
fi
Assim, você pode diferenciar tipos de número, se estiver procurando por um tipo específico:
string="-12,345"
if [[ "$string" =~ ^-?[0-9]+$ ]]
then
echo $string is an integer
elif [[ "$string" =~ ^-?[0-9]*[.,]?[0-9]*$ ]]
then
echo $string is a float
elif [[ "$string" =~ ^-?[0-9]*[.,]?[0-9]*[eE]-?[0-9]+$ ]]
then
echo $string is a scientific number
else
echo $string is not a number
fi
Nota: Poderíamos listar os requisitos sintáticos para notação decimal e científica, sendo um para permitir vírgula como ponto de raiz, bem como ".". Afirmaríamos então que deve haver apenas um desses pontos de raiz. Pode haver dois sinais +/- em um flutuador [Ee]. Eu aprendi mais algumas regras com o trabalho de Aulu e testei contra strings ruins, como '' '-' '-E-1' '0-0'. Aqui estão minhas ferramentas regex / substring / expr que parecem estar se mantendo:
parse_num() {
local r=`expr "$1" : '.*\([.,]\)' 2>/dev/null | tr -d '\n'`
nat='^[+-]?[0-9]+[.,]?$' \
dot="${1%[.,]*}${r}${1##*[.,]}" \
float='^[\+\-]?([.,0-9]+[Ee]?[-+]?|)[0-9]+$'
[[ "$1" == $dot ]] && [[ "$1" =~ $float ]] || [[ "$1" =~ $nat ]]
} # usage: parse_num -123.456
test && echo "foo" && exit 0 || echo "bar" && exit 1
abordagem que você está usando pode ter alguns efeitos colaterais indesejados - se o eco falhar (talvez a saída seja para um FD fechado),exit 0
ele será ignorado e o código tentaráecho "bar"
. Se também falhar, a&&
condição falhará e nem será executadaexit 1
! Usarif
declarações reais em vez de&&
/||
é menos propenso a efeitos colaterais inesperados.