@Charles Dufy y otros ya han dado una respuesta clara. Una solución bash pura usaría lo siguiente:
string="-12,345"
if [[ "$string" =~ ^-?[0-9]+[.,]?[0-9]*$ ]]
then
echo $string is a number
else
echo $string is not a number
fi
Aunque para los números reales no es obligatorio tener un número antes del punto radix .
Para proporcionar un soporte más completo de números flotantes y notación científica (muchos programas en C / Fortran o exportarán flotantes de esta manera), una adición útil a esta línea sería la siguiente:
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
Por lo tanto, conduce a una forma de diferenciar los tipos de números, si está buscando algún 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: Podríamos enumerar los requisitos sintácticos para la notación decimal y científica, uno de ellos para permitir la coma como punto de raíz, así como ".". Entonces afirmaríamos que debe haber solo uno de esos puntos radix. Puede haber dos signos +/- en un flotador [Ee]. Aprendí algunas reglas más del trabajo de Aulu, y probé contra cadenas malas como '' '-' '-E-1' '0-0'. Aquí están mis herramientas regex / substring / expr que parecen estar resistiendo:
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
enfoque que está utilizando puede tener algunos efectos secundarios no deseados: si el eco falla (tal vez la salida es a un FD cerrado),exit 0
se omitirá y el código lo intentaráecho "bar"
. Si falla en eso también, la&&
condición fallará, ¡y ni siquiera se ejecutaráexit 1
! El uso deif
declaraciones reales en lugar de&&
/||
es menos propenso a efectos secundarios inesperados.