Comparación de punto flotante en Shell Script

¿Puede sugerirme la syntax para hacer una comparación de punto flotante en un script de Bash? Idealmente, me gustaría utilizarlo como parte de una statement if . Aquí hay un pequeño fragmento de código:

 key1="12.3" result="12.2" if (( $result <= $key1 )) then # some code here fi 

bash no hace carrozas, usa 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 

hay otros proyectiles que pueden hacer flotadores, como zsh o ksh, puede intentar usarlos también

bc es tu amigo:

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

Tenga en cuenta la anotación algo oscura aquí ( <<< ), como una buena alternativa para echo "$result <= $key1" | bc echo "$result <= $key1" | bc .

Además, el bc parecido a bash imprime 1 para verdadero y 0 para falso .

otra forma simple y clara con bc es esta:

 if ((`bc <<< "10.21>12.22"`)); then echo "true"; else echo "false"; fi 

Usar la función exit() de awk 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 es necesario reutilizar el [ operador como if ya usara el valor de salida.

 ### The funny thing about bash is this: > AA=10.3 > BB=10.4 > [[ AA > BB ]] && echo Hello > [[ AA < BB ]] && echo Hello Hello 

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

yu puede usar esta comparación awk dentro de una cláusula if, imprimirá 1 (verdadero) si la condición es verdadera else 0 (falso), y los valores serán interpretados como valores booleanos por el si

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