2012-07-18 19 views
17
lock_percent=$(echo "scale = 5; $value2*100/$value1" | bc) 
value=`echo "$lock_percent" | bc` 

    if [[ "$value" > "$8" ]]; then 
     echo "Lock Percentage:$value percentage State Critical" 
     exit $STATE_CRITICAL 
    fi 

No soy capaz de realizar una comparación de flotación con esto. No puedo entender dónde me estoy equivocando.¿Cómo hacer la comparación del flotador en Bash?

Respuesta

24

Bash en sí no puede usar flotador. En este caso, tal vez puedas multiplicar por 10 o 100 (etc.) y obtener un valor entero que puedas comparar. O bien, puede utilizar bc comparación y el valor de retorno:

echo "10.2>10.1" | bc 
+11

También puede hacer 'bc <<< "10.2> 10.1" ', que es más rápido :) – Bernhard

13
# float number comparison 
fcomp() { 
    awk -v n1="$1" -v n2="$2" 'BEGIN {if (n1+0<n2+0) exit 0; exit 1}' 
} 

# test and example 
fcomp_test() { 
    if fcomp "$1" "$2"; then 
     echo "$1<$2" 
    else 
     echo "$1>=$2" 
    fi 
} 

fcomp_test 0.0 0.1 
fcomp_test 0.1 0.1 
fcomp_test -0.1 0.1 
fcomp_test 1e3 1e4 
fcomp_test -1.34e3 1.03e4 
fcomp_test ' 0 ' ' 1 ' 
+1

Si ha retirado la palabra clave' function', esto ser mucho menos específico de bash. También considere 'awk -v n1 =" $ 1 "-v n2 =" $ 2 "' y 'fcomp" $ 1 "" $ 2 "' - de esa manera los valores no están sujetos a la división de cadenas y expansión glob (seguro, si esto se usara correctamente, todos serán números, pero es mejor asegurarse de que el mal uso resulte en un buen error útil sobre un número inválido en lugar de un error mucho más arbitrario). –

+0

@CharlesDuffy hecho. – slitvinov

Cuestiones relacionadas