2010-11-09 10 views

Respuesta

8

Este es una especie de kludge, está usando -eq para algo distinto de lo que se pretendía, pero busca un entero, si no encuentra un int devuelve un error que puede lanzar a/dev/null y un valor de falso.

read input 
if [ $input -eq $input 2>/dev/null ] 
then 
    echo "$input is an integer" 
else 
    echo "$input is not an integer" 
fi 
+1

Esto supone que/dev/null existe – Xofo

+1

También asume que el argumento no está vacío –

21

Una forma es comprobar si contiene caracteres que no sean números. Reemplaza todos los dígitos con nada y verifica la longitud; si hay longitud, hay caracteres que no son dígitos.

if [[ -n ${input//[0-9]/} ]]; then 
    echo "Contains letters!" 
fi 

Otro enfoque es comprobar si la variable, evaluada en el contexto aritmético, es igual a sí misma. Esto es-fiesta específica

if [[ $((foo)) != $foo ]]; then 
    echo "Not just a number!" 
fi 
+0

Limpio y elegante – Xofo

+0

dulce y simple respuesta, gracias! – Felipe

+0

Si la entrada es 5b, por ejemplo, fallará la verificación. –

3

BASH FAQ entry #54

+0

Esa pregunta frecuente se titula "¿Cómo puedo saber si una variable contiene un número válido?" - proporciona muchas formas posibles de identificar. –

7

usted puede probar mediante el uso de expresiones regulares

if ! [[ "$yournumber" =~ ^[0-9]+$ ]] ; 
then exec >&2; echo "error: Not a number"; exit 1 
fi 
+0

Este es el más literal y, por lo tanto, el más fácil de recordar. –

0

Aquí hay otra forma de hacerlo. Probablemente sea un poco más elaborado de lo necesario en la mayoría de los casos, pero también manejaría los decimales. Escribí el siguiente código para obtener el número redondeado. También verifica la entrada numérica en el proceso.

#--- getRound -- Gives number rounded to nearest integer ----------------------- 
    # usage: getRound <inputNumber> 
    # 
    # echos the rounded number 
    # Best to use it like: 
    #  roundedNumber=`getRound $Number` 
    #  check the return value ($?) and then process further 
    # 
    # Return Value: 
    #  2 - if <inputNumber> is not passed, or if more arguments are passed 
    #  3 - if <inputNumber> is not a positive number 
    #  0 - if <inputNumber> is successfully rounded 
    # 
    # Limitation: Cannot be used for negative numbers 
    #------------------------------------------------------------------------------- 
    getRound(){ 
     if [ $# -ne 1 ] 
     then 
      exit 2 
     fi 

     #--- Check if input is a number 
     Input=$1 
     AB=`echo A${Input}B | tr -d [:digit:] | tr -d '.'` 
     if [ "${AB}" != "AB" ] #--- Allow only '.' and digit 
     then 
      exit 3 
     fi 
     DOTorNone=`echo ${Input} | tr -d [:digit:]` #--- Allow only one '.' 
     if [ "${DOTorNone}" != "" ] && [ "${DOTorNone}" != "." ] 
     then 
      exit 3 
     fi 

     echo $Input | awk '{print int($1+0.5)}' #--- Round to nearest integer 
    } 

    MyNumber=`getRound $1` 
    if [ $? -ne 0 ] 
    then 
     echo "Empty or invalid input passed" 
    else 
     echo "Rounded input: $MyNumber" 
    fi 
Cuestiones relacionadas