Intento de aritmética bash para un script, pero $e
no se actualiza hasta el final. La salida habla por sí misma.
max=5
for e in $(seq 1 1 $max); do
percent=$(( $e/$max*100 ))
echo "echo $e / $max : = $percent"
done
Tl; DR: muestra 1..5 como porcentaje.
Salida:
echo 1 / 5 : = 0
echo 2 / 5 : = 0
echo 3 / 5 : = 0
echo 4 / 5 : = 0
echo 5 / 5 : = 100
¿Por qué es esto?
command-line
bash
scripts
Cybex
fuente
fuente
Respuestas:
bash
no puede manejar aritmética no entera. Le dará el resultado correcto siempre que todas las expresiones sean enteras. Por lo tanto, debe evitar obtener un valor no entero en algún lugar de su cálculo.En su caso, cuando está evaluando
1 / 5
,2 / 5
etc., crea los valores enteros de cero en bash correspondientes a algunos valores no enteros y los resultados salen a cero en consecuencia. La precedencia de la división y la multiplicación son los mismos operadores precedentes y siempre se ejecutan de izquierda a derecha cuando se colocan en la expresión.Una solución será hacer primero la multiplicación y luego la división para que bash nunca tenga que manejar valores no enteros. La expresión corregida será,
fuente
1/5
no crea un valor no entero . Crea el valor entero0
, ya que el resultado de la división entera de 1 por 5 es 0. Otras operaciones utilizan con éxito ese valor de0
. Esto no es lo que pretendía el OP, pero ninguna operación crea un valor no entero y ninguna operación falla.A Bash no le va muy bien en este tipo de aritmética ... Aquí está su problema:
Si necesita manejar valores no enteros, puede usar
bc
(gracias a @Arronical por señalar cómo formatear la salida como enteros)
fuente
.0
de la salida cambiando$percent
su eco a${percent%.*}
:)A diferencia de bash, awk ofrece aritmética de coma flotante completa. Por ejemplo:
fuente
Tratar
:)
Ver sección EVALUACIÓN ARITMÉTICA de:
Solo admite enteros.
fuente