Me gustaría comprobar si mi variable $var
es en realidad un número entero o no. ¿Cómo puedo hacer eso?Bash: Probando si una variable es un número entero
Respuesta
echo your_variable_here | grep "^-\?[0-9]*$"
devolverá la variable si es un número entero y no devuelve nada de lo contrario.
shopt -s extglob
case "$var" in
+([0-9])) echo "integer";
esac
function is_int() { return $(test "[email protected]" -eq "[email protected]" > /dev/null 2>&1); }
input=0.3
input="a b c"
input=" 3 "
if $(is_int "${input}");
then
echo "Integer: $[${input}]"
else
echo "Not an integer: ${input}"
fi
que estaba necesitando algo que volvería cierto sólo para los números enteros positivos (y fallar por la cadena vacía). Me instalados en esto:
test -n "$1" -a "$1" -ge 0 2>/dev/null
la 2>/dev/null
está ahí porque de prueba se imprime un error (y devuelve 2) si hay una entrada (a -ge) no analiza como un entero
me gustaría que podría ser más corto, pero "prueba" no parece tener una opción "silenciosa" y trata a "" como un número entero válido (cero).
usted puede hacer esto:
shopt -s extglob
if [ -z "${varname##+([0-9])}" ]
then
echo "${varname} is an integer"
else
echo "${varname} is not an integer"
fi
El ## elimina con avidez la expresión regular a partir del valor devuelto por "code", por lo que si el var es un número entero que es verdadero, falso en caso contrario.
Tiene la misma debilidad que la respuesta superior (usando "$ foo! = [! 0-9]"), que si $ varname está vacío, devuelve verdadero. No sé si eso es válido. Si no basta con cambiar la prueba para:
if [ -n "$varname" ] && [ -z "${varname##[0-9]}" ]
(acaba de notar un error en el anterior donde dice que 1a1 es un número entero: P ... un segundo) –
No puedo entender la forma de "ampliación de nombre de archivo" de "uno o más de los patrones xxx". Entonces, cuando escribo [0-9] * coincide con un número entero seguido de cualquier carácter, por lo que "1a1", "1a" o "1blah" coinciden ... Con una prueba como en las preguntas frecuentes relacionadas, se puede hacer como: 'if [[" $ varname "== + ([0-9])]]' pero los '[[' no son BASH estándar y debe utilizar la expansión de expresiones regulares "adecuada" en lugar de la expansión de archivos. ¿Alguien sabe cómo hacer que mi solución funcione? : P –
La solución de ghostdog74 me dio la respuesta. Añadiendo 'shopt -s extglob' supongo que habilita la sintaxis de patrón deseada :) –
Puede realizar una operación * 2/2 que comprobar tanto si el valor es numérico y es entero. La operación devuelve 0 si no es numérico
echo "Try with 10"
var=10
var1=`echo $((($var*2)/2))`
if [ "$var" == "$var1" ]; then
echo '$var integer'
else
echo '$var not integer'
fi
echo "Try with string"
var=string
var1=`echo $((($var*2)/2))`
if [ "$var" == "$var1" ]; then
echo '$var integer'
else
echo '$var not integer'
fi
Duplicado exacto de http://stackoverflow.com/questions/2210349/bash-test-whether-string-is-valid-as-an-integer/ 21884506 # 21884506 –
Mientras usted está utilizando la versión de bash> = 3 se puede utilizar una expresión regular:
[[ $a =~ ^-?[0-9]+$ ]] && echo integer
Mientras this bash FAQ menciones inconsistencias en la aplicación fiesta de expresiones regulares en varios bash 3.x (si la expresión regular se debe citar o no), creo que en este caso, no hay caracteres que deban citarse en ninguna versión, por lo que estamos seguros. Al menos a mí me funciona en:
- 3.00.15 (1) -release (x86_64-redhat-linux-gnu)
- 3.2.48 (1) -release (x86_64-manzana-darwin12)
- 4.2.25 (1) -release (x86_64-pc-linux-gnu)
$ a="" $ [[ $a =~ ^-?[0-9]+$ ]] && echo integer $ a=" " $ [[ $a =~ ^-?[0-9]+$ ]] && echo integer $ a="a" $ [[ $a =~ ^-?[0-9]+$ ]] && echo integer $ a='hello world!' $ [[ $a =~ ^-?[0-9]+$ ]] && echo integer $ a='hello world 42!' $ [[ $a =~ ^-?[0-9]+$ ]] && echo integer $ a="42" $ [[ $a =~ ^-?[0-9]+$ ]] && echo integer integer $ a="42.1" $ [[ $a =~ ^-?[0-9]+$ ]] && echo integer $ a="-42" $ [[ $a =~ ^-?[0-9]+$ ]] && echo integer integer $ a="two" $ [[ $a =~ ^-?[0-9]+$ ]] && echo integer
- 1. Comprobando si una variable es un número entero en javascript
- 2. ¿Cómo detectar si un número dado es un número entero?
- 3. cómo saber si una variable es una tupla, una cadena o un número entero?
- 4. Python: prueba si un argumento es un número entero
- 5. ¿Determinar si el valor de JavaScript es un "número entero"?
- 6. ¿Hay alguna manera de verificar si una variable es un número entero? C++
- 7. ¿Cuál es una buena manera de verificar si un doble es un número entero en C#?
- 8. Determinar si un valor es un número entero en Python
- 9. Java - ¿Cómo comprobar si una división es un número entero o un número flotante?
- 10. Haskell: compruebe si es un número entero, o compruebe el tipo de variable
- 11. cómo comprobar si el carácter es un número entero
- 12. Pruebe si el valor es un número entero en Sass
- 13. Bash: escribir número entero de archivo binario
- 14. ¿Cuál es una mejor manera de verificar si una cadena es un número entero en iPhone?
- 15. Verificar si una cadena contiene un número entero
- 16. Detectar si una matriz contiene un número entero o doble
- 17. probando si una cadena se puede convertir como un entero en VB.NET
- 18. Perl, ¿cómo determinar si un valor variable es un número?
- 19. ¿Cómo puedo probar si un número de coma flotante es un número entero en haskell?
- 20. Compruebe que la variable es un número
- 21. Ruby round float to_int si el número entero es
- 22. ¿Cómo comprobar si un valor es un número entero o una cadena en jasmine.js?
- 23. ¿Cómo saber si un objeto es un número entero o una cadena o isa booleano?
- 24. ¿Hay alguna manera fácil de determinar si la entrada del usuario es un número entero en bash?
- 25. convertir un número entero en una matriz
- 26. Java, compruebe si el número entero es múltiple de un número
- 27. bash - ¿Cómo declarar un entero local?
- 28. número entero no 'se reduce a un número entero'
- 29. ¿Cómo puedo determinar si una variante es un número entero en VBA?
- 30. Cómo determinar si una cadena es un número en C#
en realidad también se imprimirá la variable a la salida estándar si se trata de un número entero. Realmente quiere 'grep -q', que no imprime en stdout, solo sale con 0 o no 0 si hay una coincidencia. –