2010-03-11 21 views
16

¿Puede sugerirme la sintaxis para hacer una comparación de punto flotante en un script de Bash? Idealmente, me gustaría usarlo como parte de una declaración if. Aquí es un código pequeño fragmento:Comparación de coma flotante en Shell Script

key1="12.3" 
result="12.2" 

if (($result <= $key1)) 
then 
    # some code here 
fi 
+1

Parece que es hora de escribir esa secuencia de comandos en un lenguaje de scripts diferente. Es posible que le guste Python. –

+1

@Roger: no hay que subestimar fiesta, a menudo es mucho más potente que la gente piensa .. a excepción de, ya sabes, que trata de los flotadores .. :) – falstro

+0

@Roger en realidad no ... Ya – ghostdog74

Respuesta

14

fiesta no hace flotadores, el uso de awk

key1=12.3 
result=12.5 
var=$(awk 'BEGIN{ print "'$key1'"<"'$result'" }')  
# or var=$(awk -v key=$key1 -v result=$result 'BEGIN{print result<key?1:0}') 
# or var=$(awk 'BEGIN{print "'$result'"<"'$key1'"?1:0}') 
# or 
if [ "$var" -eq 1 ];then 
    echo "do something" 
else 
    echo "result more than key" 
fi 

hay otros proyectiles que pueden hacer los flotadores, como zsh o ksh, que le gustaría probar el uso de ellos también

+1

+1, o perl, o ... – falstro

+0

Gracias GhostDog74, Sus comentarios ayudaron .. ha sido un gran apoyo .. Gracias a todos – Kiran

+3

Esto parece una forma bastante incómoda de hacerlo (sin juego de palabras). – Sorpigal

51

bc es su amigo:

key1="12.3" 
result="12.2" 
if [ $(bc <<< "$result <= $key1") -eq 1 ] 
    then 
    # some code here 
fi 

Nota el algo obs cure aquí cadena (<<<) notación, como una buena alternativa a echo "$result <= $key1" | bc.

Además, los anti-golpe-como bc impresiones 1 para verdadera y falsa 0 para .

+0

Vow .. Esto es bueno ... – Kiran

+1

bc (o incluso CC) es bueno para esto, y es ciertamente más fácil de leer que el método awk, pero hacerlo de esta manera requiere una subshell (o una tubería). En términos de eficiencia, expr es mejor y también me resulta más fácil de leer. Pero aún así, +1 por bc! – Sorpigal

+0

si lo que quiere decir con "más fácil de leer que awk" significa que es más corto, eso se debe a que estoy separando las variables del shell de las variables awk. También puedo escribirlo como 'var = $ (awk 'BEGIN {print"' $ result '"<"' $ key1 '"? 1: 0}') ' – ghostdog74

4

El uso de la función exit() de awk lo hace casi legible.

key1=12.3 
result=12.5 

# the ! awk is because the logic in boolean tests 
# is the opposite of the one in shell exit code tests 
if ! awk "{ exit ($result <= $key1) }" < /dev/null 
then 
     # some code here 
fi 

Tenga en cuenta que no hay necesidad de reutilizar el operador [ como if ya se utiliza el valor de salida.

6

otro modo sencillo y claro con BC es la siguiente:

if ((`bc <<< "10.21>12.22"`)); then echo "true"; else echo "false"; fi 
0
### The funny thing about bash is this: 
> AA=10.3 
> BB=10.4 
> [[ AA > BB ]] && echo Hello 
> [[ AA < BB ]] && echo Hello 
Hello 

Sí, ya sé que es hacer trampa, pero funciona. Y la notación científica no funciona aquí.

0

yu puede utilizar esta comparación awk dentro de una si cláusula, se imprimirá 1 (verdadero) si la condición es verdadera otro 0 (falso), y esos valores se interpretarán como Vals booleanas por la si

if (($(awk 'BEGIN {print ("'$result'" <= "'$key1'")}'))); then 
    echo "true" 
else 
    echo "false" 
fi