Cómo restar valores flotantes en un script de shell

Cómo restar valores flotantes en un script de shell

Tengo un script que usa valores flotantes, pero de alguna manera no puedo restar dos flotantes.

Este es el código de muestra

#!/bin/bash

p="1"
h="10"
m=$(echo "3.5"| bc -l)
for (( c=$p; c<=$h; c++ ))
do
   r=$(echo "($p-$m)"| bc -l)

   echo "Z $c $m $r"
done

Y este es el resultado

Z 1 3.5 -2.5
Z 2 3.5 -2.5
Z 3 3.5 -2.5
Z 4 3.5 -2.5
Z 5 3.5 -2.5
Z 6 3.5 -2.5
Z 7 3.5 -2.5
Z 8 3.5 -2.5
Z 9 3.5 -2.5
Z 10 3.5 -2.5

Respuesta1

cambiar la linea

   r=$(echo "($p-$m)"| bc -l)

a

   r=$(echo "($c-$m)"| bc -l)

ya que no lo es $p, pero $cel bucle lo cambia.

Respuesta2

bashno admite aritmética de punto flotante. kshy zshhacer. POSIXly, podrías usar cualquiera de los dos bccomola respuesta de floriánsugiere, o awk. Por ejemplo,

$ awk 'BEGIN{print 2.5+3.7}'
6.2

Ubuntu también viene con Pythony Perlque son más que capaces de realizar cálculos de punto flotante.

$ perl -le 'print(2.5+3.7)'
6.2

$ python3 -c 'print(2.5+3.7)'
6.2

Vea también una lista muy extensa de otras opciones:¿Cómo hacer cálculos de números enteros y flotantes, en bash u otros lenguajes/marcos?

Nótese también que segúnEstándar de lenguaje POSIX Shellen expansión aritmética $((...)):

Sólo se requiere aritmética de enteros largos con signo... Como extensión, el shell puede reconocer expresiones aritméticas más allá de las enumeradas.

Por lo tanto, la omisión de la aritmética de coma flotante de bashy /bin/dashestá de acuerdo con las especificaciones POSIX.

Respuesta3

Sé que es tarde, pero como el resultado apareció en Google, alguien podría leer esto. La solución es escribirlo como "$a- $b". El espacio hace que funcione para mí.

información relacionada