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.