3 votos

script de shell para verificar si la entrada es una cadena / entero / flotante

 #!/bin/bash

read -p "Enter value:" val

echo "$val"|grep "^[0-9]*$"
val="$?"

if [[ $val == 0 ]]
then
echo "Integer"
exit
fi

echo $val|grep "^[a-zA-Z]*$"

val="$?"

if [[ $val == 0 ]]
then
echo "String"
exit
fi


echo $val|grep "^[0-9]*.[0-9]*$"

val="$?"

if [[ $val == 0 ]]
then
echo "Float"
exit
fi
 

Si ingreso una cadena como "mono" dice "grep rango inválido" y luego imprime flotante. ¿Qué hice mal?

3voto

Stewart Puntos 1385

No puedo reproducir el error, pero ya es quejarse de un rango no válido, lo más probable es un locale problema. Pruebe a ejecutar la secuencia de comandos de nuevo, pero la configuración de la configuración regional:

LC_ALL=C yourscript.sh

Por supuesto, eso no va a solucionar el otro problema que es:

echo $val|grep "^[a-zA-Z]*$"

val="$?"

Después de esas líneas, $val ya no es más el valor que usted le dio, ahora es el estado de salida de la grep, por lo que todo después de que es la prueba de la cosa equivocada.


En cualquier caso, esto es realmente innecesariamente complejo. Todo lo que necesitas es:

#!/bin/bash

val="$@"

[[ -z $val ]] && echo "No input!" && exit

if [[ "$val" =~ ^[+-]?[0-9]+$ ]]; then
  echo "Number!" 
elif [[ $val =~ ^[+-]?[0-9]*\.[0-9]+$ ]]; then
  echo "Float!"
elif [[ $val =~ [0-9] ]]; then
  echo "Mixed, some numbers"
else
  echo "No numbers!"
fi  

Tenga en cuenta que estoy usando val="$@" en lugar de read. Esto significa que ahora puede ejecutar la secuencia de comandos como yourscript.sh input en lugar de tener que escribir la entrada cada vez. De esa manera, usted puede ver lo que se hizo en la historia, a evitar errores de escritura, puede ejecutar la secuencia de comandos de forma automática, etc. Por lo general es una mala idea usar read y obligar a los usuarios a entrar en la entrada.

También tenga en cuenta que he cambiado algunos de sus términos. Ahora considero a 4 posibilidades:

  1. La entrada no tiene nada, pero los números: print "Número" (si 001002 es un número entero depende de qué tipo de matemáticas que estás pensando).
  2. La entrada se compone de 0 o más números, luego un punto y luego nada, pero los números (0 o más porque .2 puede ser considerado como válido en algunos casos, si usted no quiere que cambie el ^\d*\.\d+$ a ^\d+\.\d+$).
  3. La entrada de números, pero no sólo los números: print "Mixtos, algunos de los números". Tenga en cuenta que esto también va a coger 1. que no es válido flotar y no un número entero válido.
  4. La entrada no tiene números: print "Sin números".

Yo split 3 y 4, pero usted puede unirse a ellos y les han impresión de la misma, si te gusta.

También, felicitaciones a Karel para el pensamiento de +N y -N números.

2voto

karel Puntos 16414

Este código bash devuelve un entero para enteros como 123, flotante para números de coma flotante como 123.4 y una cadena para cualquier otro valor de entrada como "123", One23 123. o 123.4.5.

 #!/bin/bash
read -p "Type a number or a string: " input
if [[ $input =~ ^[+-]?[0-9]+$ ]]; then
echo "Input is an integer."

elif [[ $input =~ ^[+-]?[0-9]+\.$ ]]; then
echo "Input is a string."

elif [[ $input =~ ^[+-]?[0-9]+\.?[0-9]*$ ]]; then
echo "Input is a float."

else
echo "Input is a string."
fi
 

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: