2010-09-02 127 views

Respuesta

1

echo your_variable_here | grep "^-\?[0-9]*$" devolverá la variable si es un número entero y no devuelve nada de lo contrario.

+2

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. –

1
shopt -s extglob 
case "$var" in 
+([0-9])) echo "integer"; 
esac 
3
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 
1

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).

1

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]}" ] 
+0

(acaba de notar un error en el anterior donde dice que 1a1 es un número entero: P ... un segundo) –

+0

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 –

+0

La solución de ghostdog74 me dio la respuesta. Añadiendo 'shopt -s extglob' supongo que habilita la sintaxis de patrón deseada :) –

0

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 
+0

Duplicado exacto de http://stackoverflow.com/questions/2210349/bash-test-whether-string-is-valid-as-an-integer/ 21884506 # 21884506 –

10

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 
Cuestiones relacionadas