Nota: Observa que después de este apunte escribí otro sobre operaciones con decimales en Bash utilizando otro método mucho más “elegante”. Puedes leerlo aquí.

Necesitaba realizar unas comparaciones de números con decimales, positivos y negativos para unos pequeños scripts que informan sobre el estado del clima (posa el ratón un segundo sobre la imagen de “cielo sobre Cartagena” para leerlo. En la columna de la derecha).

Problema

Si en un script hacemosecho "scale=2; 12.5 - 12.2 | bc -l" nos dará como resultado .3 (sin cero delante).
Para producir un número “entero” (con el cero delante), podemos hacer lo siguientea=12.5; b=12.2;\
echo "scale=6; resta = $a -$b; if (resta < 1 && 0 <= resta ) { print "0" }; print resta" |\
bc -l

Que imprimiría 0.3, PERO si la resta es negativa nos mostrará 0-.3 (cero menos coma tres)

Además ninguna de las formas anteriores es admitida por IF que solo compara números enteros:a=0.3; if [ $a -gt 0.1 ]; then echo "A es mayor que B"; else echo "A es menor que B"; fi
DICE que -->bash: [: 0.3: se esperaba una expresión entera

Solución

Al final una solución de casa de mi abuela: multiplicar todo por 1000 (o cualquier otro factor suficientemente grande como para convertir tus operaciones en números enteros) y a tomar viento. Algo así:#hacemos la operacion que nos producía un decimal negativo
resta=`factor=1000; a=12.2; b=12.5; \
echo "( $a*$factor ) - ( $b*$factor )" | bc`
#$resta es -300.0
#quitamos los decimales
resta=`${resta/.*/}
#$resta es -300
#hacemos comparacion
comparador=`factor=1000; \
echo "$factor * 0.1" | bc`
#$comparador=100.0
#quitamos los decimales
comparador=${comparador/.*/}
#hacemos la comparacion
if [ $resta -gt $comparador ]; then echo "A es mayor que B"; else echo "A es menor que B"; fi
A es menor que B