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
- Tener conocimientos básicos sobre Linux. Nuestras guías Tutorial de comandos Linux, Permisos de Linux y Cómo buscar con la línea de comandos de Linux son un excelente comienzo. Haremos uso de los conceptos que explicamos en estos recursos para desarrollar un reporte del uso de disco y de archivos que superen un determinado tamaño.
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
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
adf
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 afind
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:
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.