Categorías
GNU-Linux Script

Crea y ejecuta tu primer script de Bash Shell

Uso de operadores aritméticos

Uso de operadores aritméticos en Bash Scripting

Mientras escribes tus scripts en bash, a menudo te encontrarás queriendo averiguar el resultado de un cálculo aritmético para determinar el espacio restante en el disco, el tamaño de los archivos, las fechas de caducidad de las contraseñas, el número de hosts, el ancho de banda de la red, etc.

En este capítulo aprenderás a utilizar los operadores de bash para realizar varios cálculos aritméticos.

Para refrescar tu memoria, aquí están los operadores aritméticos en bash:

Operador Descripción
+ Adición
Substracción
* Multiplicación
/ División de enteros (sin decimales)
% División de módulos (sólo da el resto)
** Exponenciación (x a la potencia y)

Realizar sumas y restas en scripts bash

Vamos a crear un script bash llamado adicion.sh que simplemente sumará dos tamaños de archivos (en bytes) y mostrará la salida.

Ya debes estar familiarizado con los argumentos en los scripts bash. Espero que también estés familiarizado con los comandos cut y du.

El comando du te da el tamaño del archivo. La salida tiene tanto el tamaño como el nombre del archivo. Aquí es donde se utiliza el comando cut para extraer la primera columna (es decir, el tamaño del archivo) de la salida. La salida del comando du se pasa al comando cut usando la redirección de tuberías.

Este es el script:

#!/bin/bash

as1=$(du -b $1 | cut -f1)
as2=$(du -b $2 | cut -f1)

echo "El tamaño de $1 es: $as1"
echo "El tamaño de $2 es: $as2"

total=$(($fs1 + $fs2))

echo "El tamaño total es: $total"

Observa que pasarás los dos nombres de archivo como argumentos al script. Por ejemplo, aquí ejecuto el script y paso los dos archivos /etc/passwd y /etc/group como argumentos:

./adicion.sh /etc/passwd /etc/group
El tamaño de /etc/passwd es: 2795
El tamaño de /etc/group es: 1065
El tamaño de es: 3860

La linea más importante en el script adicion.sh es:

total=$(($as1 + $as2))

Donde has utilizado el operador + para sumar los dos números $as1 y $as2. Nota también que para evaluar cualquier expresión aritmética tienes que encerrarla entre dobles paréntesis como sigue:

$((expresion-aritmetica))

También puedes utilizar el operador menos (-) para la resta. Por ejemplo, el valor de la subvariable en la siguiente declaración resultará en siete:

sub=$((10-3))

Realizar multiplicación y división en scripts bash

Creemos un script bash llamado gigaamega.sh que convierta Gigabytes (GB) a Megabytes (MB):

#!/bin/bash

GIGA=$1
MEGA=$(($GIGA * 1024))

echo "$GIGA GB es igual a $MEGA MB"

Ahora vamos a ejecutar el script para averiguar cuántos Megabytes hay en cuatro Gigabytes:

$ ./gigaamega.sh 4
4 GB es igual a 4096 MB

Aquí utilicé el operador (*) para multiplicar el número de Gigabytes por 1024 para obtener el equivalente en Megabytes:

MEGA=$(($GIGA * 1024))

Resulta sencillo añadir más funcionalidad a este script para convertir Gigabytes (GB) a Kilobytes (KB):

KILO=$(($GIGA * 1024 * 1024))

Te dejaré convertir los Gigabytes en bytes como práctica 😉

También puedes utilizar el operador (/) para dividir dos números. Por ejemplo, el valor de la variable div en la siguiente declaración se calculará en cinco:

div=$((20 / 4))

Ten en cuenta que se trata de una división entera, por lo que se pierden todas las fracciones. Por ejemplo, si divides 5 entre 2, obtendrás 2, lo cual es incorrecto, por supuesto:

$ div=$((5 / 2))
$ echo $div
2

Para obtener una salida decimal, puedes utilizar el comando bc. Por ejemplo, para dividir 5 entre 2 con el comando bc, utiliza la siguiente sentencia:

echo "5/2" | bc -l
2.50000000000000000000

Ten en cuenta que también puedes utilizar otros operadores con el comando bc siempre que trate con números decimales:

Uso de la potencia y el resto (módulo)

Vamos a crear una calculadora de potencias. Voy a crear un script llamado potencia.sh que aceptará dos números a y b (como argumentos) y mostrará el resultado de a elevado a la potencia b:

#!/bin/bash
a=$1
b=$2
resultado=$((a**b))
echo "$1^$2=$resultado"

Observa que utilizo el operador (**) para calcular el resultado de a elevado a la potencia b.

Hagamos unas cuantas ejecuciones del script para asegurarnos de que da las respuestas correctas:

$ ./potencia.sh 2 3
2^3=8
$ ./potencia.sh 3 2
3^2=9
$ ./potencia.sh 5 2
5^2=25
$ ./potencia.sh 4 2
4^2=16

También puede utilizar el operador de módulo (%) para calcular los restos de números enteros. Por ejemplo, el valor de la variable res en la siguiente sentencia se calculará como 2:

res=$((17%5))

El resto aquí es 2 porque 5 entra en 17 tres veces, y quedan dos.

Momento de la práctica: hacer un script bash de conversión de títulos

Terminemos este capítulo creando un script llamado caf.sh que convertirá los grados Celsius en grados Farenheit utilizando la siguiente ecuación:

F = C x (9/5) + 32

Este será un buen ejercicio para que pruebes las cosas nuevas que acabas de aprender.

Aquí hay una solución (podría haber varias maneras de lograr el mismo resultado):

#!/bin/bash

C=$1
F=$(echo "scale=2; $C * (9/5) + 32" | bc -l)

echo "$C grados Celsius es igual a $F grados Fahrenheit."

Usé el comando bc porque estamos tratando con decimales y también usé scale=" para mostrar la salida con dos decimales.

Hagamos unas cuantas ejecuciones del script para asegurarnos de que los resultados son correctos:

$ ./c2f.sh 2
2 grados Celsius es igual a 35.60 grados Fahrenheit.
$ ./c2f.sh -3
-3 grados Celsius es igual a 26.60 grados Fahrenheit.
$ ./c2f.sh 27
27 grados Celsius es igual a 80.60 grados Fahrenheit.

Perfecto. Esto nos lleva al próximo capítulo.