Cómo desarrollar scripts con bash en Linux

Cómo desarrollar scripts con Bash en Linux

En palabras simples, los scripts son archivos de texto plano que contienen una serie de comandos. Estos son ejecutados por un intérprete (también conocido como shell) línea por línea. En la mayoría de las distribuciones Linux hoy en día, Bash es el intérprete de comandos por defecto y la que utilizaremos en los ejemplos. Al aprender cómo desarrollar scripts con Bash en Linux, podrás automatizar tareas rutinarias y realizarlas con mayor rapidez.

Requisitos previos

Encabezado de un script

La primera línea del archivo debe indicar la shell que usaremos para ejecutar el script. Este detalle es muy importante debido a que otros intérpretes pueden entender de manera distinta los mismos comandos o producir errores si no los reconocen.

A continuación, crea un nuevo archivo llamado infosistema.sh:

nano infosistema.sh

Como próximo paso, agrega la referencia a Bash:

#!/bin/bash

Los caracteres #! son conocidos por el nombre shebang y sirven para indicar el intérprete de comandos que ejecutará el script. Por ese motivo, la ruta absoluta de Bash aparece junto a ellos.

Cuerpo o contenidos del script

El cuerpo del script es donde colocamos la secuencia de comandos que compone su contenido (uno por cada línea). A cada uno de ellos podemos ejecutarlo o guardar su salida en un contenedor conocido como variable. Otra manera de ver a las variables consiste en considerarlas como cajas donde podemos almacenar un valor dado o la salida de un comando para usarla después.

Para guardar la salida de un comando en una variable, hay que encerrarlo entre paréntesis y colocar el signo $ adelante. Así, en MI_VARIABLE=$(comando), la variable MI_VARIABLE contiene la salida de comando (el cual representa cualquier instrucción ejecutada por la shell). Para utilizar el contenido de MI_VARIABLE en el script es necesario colocar $MI_VARIABLE en el lugar correspondiente.

Como práctica recomendada, los administradores de sistemas suelen emplear comentarios en el cuerpo del script para explicar el propósito de ciertas líneas o bloques de código. Esto también sirve como un recordatorio personal y también para otras personas. Para comenzar un comentario en una línea, basta con insertar el caracter # a partir de la posición que el intérprete debe ignorar.

Para afianzar estos conceptos, abre nuevamente el archivo:

nano infosistema.sh

y agrega las siguientes líneas:

# Separador de secciones
SEPARADOR='=================='

# Guardar la fecha en formato dd-mm-yyyy
FECHA_ACTUAL=$(date +'%d-%m-%Y')

# Nombre del equipo
EQUIPO=$(hostname)

echo "Reporte del sistema $EQUIPO" > "$FECHA_ACTUAL.txt"

Al encerrar variables y caracteres entre un par de comillas dobles podemos unir sus contenidos en una sola expresión. En el caso de "$FECHA_ACTUAL.txt", Bash primero evalúa la variable y luego concatena el resultado con los caracteres restantes. De esa manera formamos la cadena de texto que usaremos como nombre de archivo.

Luego de guardar los cambios, otorga permisos de ejecución al script y ejecútalo con ./ seguido del nombre:

chmod +x infosistema.sh
./infosistema.sh
como desarrollar scripts con bash en linux 1

Tal como observas arriba, deberías ver un archivo con la fecha de hoy como nombre y la extensión .txt. El único contenido por el momento será la línea Reporte del sistema, acompañada del nombre del equipo. En tu caso, el nombre del archivo será diferente (de acuerdo a la fecha en que ejecutes el script), al igual que el contenido de EQUIPO.

Agregar otros comandos

Para continuar, abre nuevamente el script

nano infosistema.sh

y añade el siguiente bloque:

echo "" >> "$FECHA_ACTUAL.txt"

echo "$SEPARADOR Uso de disco $SEPARADOR" >> "$FECHA_ACTUAL.txt"
echo "$(df --human-readable --total --type=ext4)" >> "$FECHA_ACTUAL.txt"
echo "" >> "$FECHA_ACTUAL.txt"

echo "$SEPARADOR Archivos > 50M $SEPARADOR" >> "$FECHA_ACTUAL.txt"
echo "$(find $1 -type f -size +50M)" >> "$FECHA_ACTUAL.txt"

donde:

  • echo "" >> "$FECHA_ACTUAL.txt" agrega una línea vacía.
  • "$SEPARADOR Uso de disco $SEPARADOR" y "$SEPARADOR Archivos > 50M $SEPARADOR" insertan encabezados que aclaran el propósito de cada sección.
  • Cuando agregas la opción --human-readable --total --type=ext4 a df puedes limitar los resultados a aquellos sistemas de archivos del tipo ext4, incluir un total y mostrar las cantidades en unidades amigables.
  • El $1 que ves junto a find representa el primer argumento que proporcionarás al script en instantes. De esa forma, puedes ver el reporte para distintos directorios. Además de $1, existen otros argumentos posicionales que tienes a tu alcance.

Por ejemplo, ejecuta el script con /var como argumento. En este caso, utiliza sudo para poder leer el contenido de este directorio.

sudo ./infosistema.sh /var

Aunque el resultado no será idéntico en tu caso, deberías ver algo similar a lo siguiente:

como desarrollar scripts con bash en linux 2

Siguiendo el mismo modelo es posible agregar otros comandos que muestren información adicional sobre el sistema. A medida de que sumes nuevas secciones te aconsejamos considerar el uso de funciones para reutilizar código. Además, esto te facilitará el mantenimiento del script en el futuro.

Conclusión

En esta guía aprendiste cómo desarrollar scripts con Bash en Linux. Si bien esta introducción no cubre todos los conceptos y posibilidades que esta shell ofrece, estos primeros pasos te serán de gran utilidad para profundizar más si lo deseas. Al empezar a automatizar tareas repetitivas, verás los dividendos del tiempo dedicado a escribir tus propios scripts.

Gabriel Cánepa
Gabriel Cánepa

Gabriel trabaja actualmente como desarrollador full-stack en Scalar, una firma que se dedica a hacer valuaciones de empresas. Es Administrador de Sistemas certificado por la Fundación Linux y previamente ha escrito un gran número de artículos y contenidos técnicos sobre el tema para: DigitalOcean, Linode, Carrera Linux Argentina y Tecmint.

Tiene una certificación en programación de la Universidad de Brigham Young-Idaho, y está completando las carreras de programador y analista de sistemas en la Universidad Nacional de Villa Mercedes (UNViMe).

En su tiempo libre, Gabriel disfruta leyendo libros de Stephen R. Covey, tocando piano y guitarra, y enseñando conocimientos de programación a su dos hijas.