Saltar al contenido

Comparación de números decimales en bash

Te damos la solución a este contratiempo, o por lo menos eso creemos. Si tienes preguntas dínoslo y sin dudas

Solución:

En el interior [[...]]< es para string comparación.

Asi que [[ 3.56 < 2.90 ]] o [[ (3.56 < 2.90) ]] o [[ ((3.56 < 2.90)) ]] o [[ (((3.56 < 2.90))) ]]... es solo comparar el 3.56 string con el 2.90 string léxicamente (y léxicamente, 3 es mayor que 10 por ejemplo).

Para la comparación de enteros, es [[ 3 -lt 2 ]] o (( 3 < 2 )). Si desea una comparación de punto flotante, necesita ksh93, zsh o yash o una utilidad externa como awk o perl; bash no puedo hacerlo

Por ejemplo, podría definir una función como:

compare() (IFS=" "
  exec awk "BEGINif (!($*)) exit(1)"
)

Que podrías usar, por ejemplo, como:

if compare '1.5*10 < 1e3'; then
  echo less
fi

O incluso para eso importa:

if compare '"bar" < "foo"'...

que hacer string comparaciones

No pase datos proporcionados externamente sin control a ese compare funcionar como si fuera una vulnerabilidad de inyección de comandos (los datos se interpretan como awk código, awk puede ejecutar comandos con su system() por ejemplo).

bash no entiende los números de punto flotante.
citando bash página del manual, sección EVALUACIÓN ARITMÉTICA:

La evaluación se realiza en enteros de ancho fijo […].

Asi que ((3 < 4)) o ((3 < 2)) son en realidad expresiones aritméticas correctas. Puede escribir lo siguiente:

$ echo "$((3 < 4)) -- $((3 < 2))"

producción: 1 -- 0

Pero $ echo $((3.3 < 3.6)) devolverá un mensaje de error de sintaxis. En su ejemplo, en realidad está comparando cadenas. De ahí algún ejemplo:

$ [[ ((3.56 < 04.90)) ]]; echo $?

producción: 1

Tienes la posibilidad difundir este artículo si si solucionó tu problema.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *