¿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