bash - arithmetic - ¿Cómo usar expr en float?
bc calculator (5)
Sé que es una pregunta realmente estúpida, pero no sé cómo hacer esto en bash:
20 / 30 * 100
Debería ser 66.67
pero expr dice 0
, porque no soporta float. ¿Qué comando en Linux puede reemplazar a expr y hacer esta ecualización?
Como se informó en la página de manual de bash:
El shell permite evaluar expresiones aritméticas, en determinadas circunstancias ... La evaluación se realiza en enteros de ancho fijo sin comprobación de desbordamiento, aunque la división por 0 se captura y se marca como un error.
Puedes multiplicar por 100 antes para obtener un mejor resultado parcial:
let j=20*100/30
echo $j
66
O por un múltiplo más alto de 10, e imagina el lugar decimal al que pertenece:
let j=20*10000/30
echo $j
66666
Generalmente uso perl:
perl -e ''print 10 / 3''
solo hazlo en awk
# awk ''BEGIN{print 20 / 30 * 100}''
66.6667
guardarlo en variable
# result=$(awk ''BEGIN{print 20 / 30 * 100}'')
# echo $result
66.6667
bc
hará esto por ti, pero el orden es importante.
> echo "scale = 2; 20 * 100 / 30" | bc
66.66
> echo "scale = 2; 20 / 30 * 100" | bc
66.00
o, para su caso específico:
> export ach_gs=2
> export ach_gs_max=3
> x=$(echo "scale = 2; $ach_gs * 100 / $ach_gs_max" | bc)
> echo $x
66.66
Sea cual sea el método que elija, este está listo para ser incluido como una función para facilitar su vida:
#!/bin/bash
function pct () {
echo "scale = $3; $1 * 100 / $2" | bc
}
x=$(pct 2 3 2) ; echo $x # gives 66.66
x=$(pct 1 6 0) ; echo $x # gives 16
> echo "20 / 30 * 100" | bc -l
66.66666666666666666600
Esta es una simplificación de la respuesta por paxdiablo. El -l establece la escala (número de dígitos después del decimal) a 20. También carga una biblioteca matemática con funciones trigonométricas y otras cosas.