miércoles, 21 de agosto de 2019

¡Cálculos con números decimales en BASH!

                               (P) Hugo Napoli, 2019                              

Cuando realizamos operaciones matemáticas con números decimales, BASH necesita de comandos que ya están presentes y disponibles (como "awk") o de otros que hay que instalar en el sistema como "bc" (instrucción de la cual hay documentación de sobra en miles de sitios web).
BASH, únicamente puede realizar cálculos con números enteros, al igual que otros muchos lenguajes de programación.

Hay varias maneras de realizar este tipo de cálculo con números decimales en BASH, por ejemplo, invocando a herramientas presentes en otros lenguajes de programación (como Python, Ruby y Perl, entre otros):
Utilizando a Python desde BASH.

Ejemplo 1:

python -c 'print 8.7 + 6.5'

Ejemplo 2:

suma1=`python -c 'print 8.7 + 6.5'`
echo $suma1
Utilizando a Ruby desde BASH.

Ejemplo 1:

ruby -e 'print 8.7 + 6.5'

Ejemplo 2:

suma2=`ruby -e 'print 8.7 + 6.5'`
echo $suma2
Utilizando a Perl desde BASH.

Ejemplo 1:

perl -e 'print 8.7 + 6.5'

Ejemplo 2:

suma3=`perl -e 'print 8.7 + 6.5'`
echo $suma3
Cualquiera de estos 3 métodos nos arrojará el resultado 15.2, de modo que, al realizar cálculos con otras cifras y diferentes operadores, también obtendremos los resultados esperados.

Ahora, bien... ¿Qué sucedería, si en lugar de necesitar realizar operaciones con números decimales, necesitásemos operar con variables que en su interior contuviesen  números de este mismo tipo?

Un razonamiento simple y directo, nos indicaría que si esto es correcto

python -c 'print 8.7 + 6.5'

esto, también lo sería

a=8.7
b=6.5
python -c 'print a + b'

¿Se nos habrá ocurrido esto, tal vez?

a=8.7
b=6.5
python -c 'print $a + $b'

Pues...
No funcionará. Ni con Python, ni con Ruby, ni con Perl... Ni con el potentísimo BASH y sus herramientas nativas.

Veremos, entonces, cómo igualmente nos las arreglaremos (de manera muy sencilla y sin instalar nada) para realizar operaciones de este tipo.

"awk", es una gran herramienta que no necesita ser instalada, y que a su vez puede ser invocada fácilmente, si se comprende una pequeña parte de su elemental estructura.

Observemos el siguiente código:

read -p "Ingresa un número decimal: " num1
read -p "Ingresa otro número decimal: " num2
awk -v a="$num1" -v b="$num2" 'BEGIN {print a+b}'

En la 3a línea, vemos cómo "a" toma el valor de "num1".
Si observamos un poco mejor, veremos que, en la misma línea, "b" toma el valor de "num2".
Si necesitáramos continuar, seguiríamos el mismo razonamiento:

awk -v a="$num1" -v b="$num2" -v c="$num3" -v d="$num4"

etc., restando únicamente escribir lo siguiente para que la operación se complete:

awk -v a="$num1" -v b="$num2" -v c="$num3" -v d="$num4" 'BEGIN {print a+b*c/d}'

Esto es solo un ejemplo. Como se ve, hemos realizado la operación "a+b*c/d", pero podríamos haber sumado únicamente (a+b+c+d) o efectuado otro tipo de operación matemática.

El hecho es que necesitamos hacer el traspaso de valores de unas variables (las de bash) a otras (las de awk) en la misma línea en la cual también haremos las operaciones matemáticas... Por lo tanto, si respetamos la sintaxis de la siguiente línea

awk -v variable_awk_1="$variable_bash_1" -v variable_awk_2="$variable_bash_2" 'BEGIN {print variable_awk_1+variable_awk_2}'

podremos utilizar números decimales en BASH sin necesidad de instalar complementos en el sistema operativo, ni importarnos si los cálculos van a ser efectuados con números o con variables.

Espero que esta información te haya sido de utilidad, al igual que a mí.
Un saludo, estimado lector.



Artículos consultados:

https://mathblog.com/floating-point-arithmetic-in-the-bourne-again-shell-bash/
https://askubuntu.com/questions/440654/why-let-command-doesnt-work-to-add-real-numbers
https://www.gnu.org/software/bash/
https://en.wikipedia.org/wiki/Bash_(Unix_shell)
http://research.iac.es/sieinvens/SINFIN/CursoUnix/cap8.php
https://www.tldp.org/pub/Linux/docs/ldp-archived/users-guide/translations/es/glup_0.6-1.1-html-1.1/guide04.htm
https://www.shellscript.sh/

No hay comentarios.:

Publicar un comentario