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 $c
el bucle lo cambia.
Respuesta2
bash
no admite aritmética de punto flotante. ksh
y zsh
hacer. POSIXly, podrías usar cualquiera de los dos bc
comola respuesta de floriánsugiere, o awk
. Por ejemplo,
$ awk 'BEGIN{print 2.5+3.7}'
6.2
Ubuntu también viene con Python
y Perl
que 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 bash
y /bin/dash
está 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í.