Apuntes mientras aprendo sobre software y computadoras.

Computación

Programación en bash: operaciones matemáticas

Continuamos nuestra serie de apuntes para aprender a programación en la shell de Linux, en Bash, y esta vez vamos a centrarnos en operaciones matemáticas.

El de hoy es nuestro noveno apunte.

En un principio pensaba que tal vez iba a ser una buena idea numerar la serie, pero me dejé llevar por esa regla no escrita de la web que dice:

Si un título viene acompañado por número, nadie va a leerlo.

La lógica detrás de esta idea es que nadie tiene tiempo para leer toda una serie de textos. Si algo en el título indica que hay que leer varias partes seguidas, es como un repelente para la atención.

¿Hay algo de cierto en eso?

En todo caso, nos estamos alejando del tema de hoy.

Lo que vamos a tratar de aprender son algunos comandos que nos ayudan a realizar operaciones matemáticas en la terminal.

Expansión aritmética en Bash

Al programar en Bash, la expansión aritmética es lo que va a permitirnos realizar cálculos matemáticos dentro de un script.

Más adelante en el texto voy a revisar algunos comandos para trabajar con números. Aun así, la expansión aritmética me parece la forma más directa de empezar a enfocar esto.

Antes revisé la expansión de parámetros, que es algo parecido a esto si lo observamos desde la forma de escribirlo.

En la expansión de parámetros usamos el operador ${} para acceder a mayores opciones para trabajar con la variable.

Por otra parte, usamos el parámetro $(( )) para la expansión aritmética. Si, son dos sets de paréntesis con un signo de dólar por delante.

Visto en un ejemplo, creemos la variable suma:

suma=1+2

Y ahora usemos la expansión aritmética:

echo $((suma))
3

Listo, ahí lo tenemos. Se puede decir que expandimos la variable suma al resultado de su valor.

Pero esto no se termina, podemos utilizar más variables, por ejemplo:

A=2
B=4

echo $((A+B)
6

Con esta herramienta en nuestro conocimiento, y los operadores matemáticos correspondientes, podemos hacer sumas, restas, divisiones y multiplicaciones

El detalle a tener en cuenta es: la expansión matemática solamente trabaja con números enteros, no puede entregarnos decimales.

Operaciones matemáticas en Bash

El comando expr

En su forma de uso más básica, el comando expr muestra el resultado de nuestra operación matemática directamente en la terminal.

Dicho de otro modo, el output que resulta de nuestro input llega sin que tengamos que llamarlo.

Voy a revisar algunos ejemplos con este comando, pero es posible chequear todo lo que hace revisando directamente en el manual, haciendo:

man expr

O también para un vistazo más conciso de la sintaxis:

expr --h

Sin más, vamos a darle algunas vueltas como por ejemplo suma:

expr 1+2
1+2

Momento, eso no esta bien. Algo no salió exactamente como esperaba. Bien, esto es importante, recordar dejar espacios entre las cifras para que funcione el comando.

expr 1 + 2
3

Bien, perfecto, ya estamos funcionando como nos gusta.

División:

expr 5 / 2
2

Eso parece ser no del todo exacto, buscábamos una respuesta más similar a 2.5 o algo por el estilo. En todo caso, este comando solamente se maneja con números sin decimales (es decir, con integers y no con floats).

Alguna resta:

expr 5 – 10
-5

Perfecto, todo bien. También podemos usarlo para cosas diferentes, como por ejemplo conocer la cantidad de caracteres en un texto (string):

expr length hola
4

En general, expr permite varias cosas más, como por ejemplo comparar números para ver cual es más grande, ese tipo de cosas. Te recomiendo investigarlo un poco m, mientras tanto ahora pasemos con…

El comando let:

Este comando es similar a expr, también nos permite realizar operaciones matemáticas dentro de la terminal.

Hasta donde yo se no hay manual para let, pero podemos ver la página de ayuda con:

let --help

Ya que estamos en esto, probemos alguna operación básica. Y es bueno aclararlo ahora, en este caso la sintaxis espera que NO dejemos espacios entre las cifras.

let 1+2

Y nada sucede. No hay resultado. La principal diferencia con lo que venimos estudiando es que let no nos entrega el output con el resultado, tenemos que llamarlo.

Para conseguir llamar al resultado, tenemos que usar el comando combinandolo con una variable. No hay inconvenientes, ya estudiamos variables en otra oportunidad:

let "x=1+2"
echo $x
3

Otra vez, al igual que expr, let solamente nos permite trabajar con números enteros.

Operaciones con bc

Antes vimos dos comandos, pero bc es algo más complejo.

El manual nos presenta bc como un lenguaje para trabajar con números, variables, declaraciones y muchas otras cosas. Esto incluye librerías, y distintos modos de uso.

Pero como prácticamente no utilizo la terminal para asuntos de matemática, la mayoría de estas opciones me pasan hoy por arriba de la cabeza.

La utilización de este lenguaje no es tan directa como la que vimos antes con los comandos, y usarlo correctamente dentro de un programa implica detenerse a revisar su sintaxis.

Por lo que pude revisarlo, podemos invocarlo por ejemplo de esta forma:

echo "3-2" | bc
1

Y también una división:

echo "5/2" | bc -l
2.50000000000000000000

Es cierto, solamente conocemos lo que puede hacer bc de forma superficial.

Sin embargo también podemos decir que ahora si podemos trabajar con números racionales al hacer operaciones dentro de la terminal.

Y eso es una victoria, sin dudas.

Conclusión:

En este apunte aprendimos operaciones matemáticas dentro de lo que es programación en Bash .

No fuimos en profundidad, solo porque el tema se abría en muchas ramificaciones. Más de las que sencillamente podíamos abarcar.

Pero ya conocemos algo. El detalle clave para conocer posiblemente sea el de una expansión aritmética.

Estas herramientas pueden servir luego en nuestros programas más complejos, por ejemplo creando cuentas regresivas o aumentando el valor de alguna variable.

Ya sea que hayas aprendido algo nuevo o no, me gustaría leer tus opiniones en los comentarios. De ese modo me vas a ayudar para poder mejorar este sitio web.

Hasta el próximo apunte.

Recursos:

Dejar una respuesta