Bash Scripts: qué es y cómo funciona
Para realizar las tareas de administración de sistemas es muy importante que podamos automatizar los procesos, de manera que se reduzca nuestra carga de trabajo o la posibilidad de producir errores durante la administración de los servidores. En este post te vamos a enseñar los Scripts Bash, una de las herramientas más utilizadas para conseguir estas automatizaciones, sencilla de usar y al alcance de cualquier persona que sea capaz de editar archivos de texto plano.
¿Qué es Bash Scripts?
Los Scripts Bash o Bash Scripts son simples archivos de texto que contienen listas de comandos que deben ser ejecutados en secuencia por el shell. Se escriben en archivos de texto plano e invocarlos es tan sencillo como referenciarlos en un comando de terminal.
Por si no lo sabes, Bash es un intérprete de comandos o shell que actúa como una interfaz entre el usuario y el sistema operativo. Para que nos entendamos, Bash sería lo que conocemos como la interfaz de línea de comandos de los sistemas operativos. Aunque en la práctica Bash no es el único sistema de línea de comandos, es el más conocido y extendido. La inmensa mayoría de los sistemas Linux utilizan Bash como intérprete de línea de comandos
Los Bash Scripts están pensados para hacer todo tipo de tareas, aunque en la mayor parte de las ocasiones los administradores de sistemas los utilizan para la automatización de tareas repetitivas y complejas, simplificando nuestro día a día y aumentando la productividad.
Fundamentos básicos de Bash Scripts
Para comenzar a entender cómo debemos realizar los scripts Bash, vamos a repasar los fundamentos básicos para su creación.
Estructura y sintaxis básica de los Scripts
Los Bash Scripts se escriben en archivos de texto plano. Los podemos crear con cualquier editor de línea de comandos, como los comandos Vim o los comandos Nano.
Un script Bash comienza con la línea #!/bin/bash, que le dice al sistema que este archivo debe ser ejecutado usando Bash. A continuación debemos escribir el conjunto de comandos que se ejecutará de manera secuencial para realizar cualquier proceso que queramos automatizar.
#!/bin/bash echo 'Hola, Arsys!'
Declaración de variables y tipos de datos en Bash
El estilo para la declaración de variables en Bash es muy similar al que ya conocemos de la mayoría de lenguajes. Simplemente colocamos el nombre de la variable, el símbolo =, seguido del valor que queremos asignar. No es necesario declarar un tipo para las variables.
En el siguiente ejemplo vemos un script bash que funcionaría exactamente igual que el anterior, aunque el mensaje lo hemos asignado a una variable.
#!/bin/bash saludo='Hola, Arsys!' echo $saludo
Control de flujo y estructuras de decisión
Como en otros lenguajes, es posible utilizar diversas estructuras de control de flujo, como condicionales y bucles. Sus nombres son similares a los que ya conocemos if-else, while, y for.
Este es el ejemplo de un condicional:
#!/bin/bash if [ '$saludo' == 'Hola, mundo!' ]; then echo 'Condición cumplida' else echo 'Condición no cumplida' fi
A continuación vemos un ejemplo de bucle for para recorrer los elementos de un array:
#!/bin/bash nombres=('Alice' 'Bob' 'Charlie' 'Diana') for nombre in '${nombres[@]}'; do echo 'Hola, $nombre' done
Uso de comandos internos de Bash
Dentro de los scripts Bash disponemos de los comandos que podemos usar en el terminal habitualmente, aunque algunos de ellos pueden cambiar un poco, debido al contexto en el que se usan.
Entre los comandos de Bash más habituales están los conocidos como cd, mkdir, rm, cp, mv, tar, cat, etc.
Además son muy útiles algunos comandos extra como echo, printf, read y otros que permiten realizar tareas habituales de los scripts como la entrada y salida de datos. Enseguida veremos ejemplos.
Gestión de entrada y salida en los Scripts Bash
Otra cosa que necesitaremos aprender a la hora de crear scripts de Bash es realizar la entrada y salida.
El comando habitual para obtener la entrada de datos del usuario es read, mientras que para la salida tenemos diversos comandos, siendo el más común echo.
En el siguiente ejemplo de script vamos a realizar la entrada de datos, solicitando el nombre del usuario, que luego vamos a manipular y almacenar en un fichero. Finalmente mostraremos el contenido del fichero de texto.
#!/bin/bash echo 'Por favor, introduce tu nombre:' read nombre echo $nombre | tr '[:lower:]' '[:upper:]' > nombre_mayusculas.txt echo 'Aquí está el contenido del archivo generado:' cat nombre_mayusculas.txt
Ventajas de usar Bash Scripts
Bash Script nos ofrece múltiples beneficios y sus usos son tan diversos como podamos imaginar. Son especialmente útiles a la hora de optimizar nuestro trabajo y evitar tareas repetitivas. Algunos ejemplos donde podemos sacarle partido son los siguientes.
Automatización de tareas repetitivas
Gracias a los scripts podemos escribir código con conjuntos de comandos que se ejecutarán de manera automática las veces que sea necesario. Con ello conseguimos evitar la realización de tareas repetitivas y automatizar procesos de todo tipo.
Incluso, además de optimizar nuestro tiempo, la definición de los scripts también nos permite evitar errores al realizar las tareas.
Flexibilidad y adaptabilidad a diferentes entornos
Como hemos dicho antes, los scripts Bash funcionan en múltiples plataformas. Podemos escribirlos una vez y utilizarlos luego en cualquier distribución de Linux, así como en Mac o incluso Windows si tenemos un terminal basado en Bash.
Eficiencia en la gestión de procesos y recursos
Gracias a la automatización de tareas podemos ser más eficientes en la gestión de los procesos de administración de servidores y la configuración de los sistemas. Al minimizar las intervenciones manuales se consigue optimizar los procesos internos.
Integración con otros sistemas y herramientas
Gracias a los scripts Bash también podemos controlar otras herramientas a las que tengamos acceso mediante comandos del sistema. Esto nos abre un conjunto enorme de posibilidades.
Facilidad de aprendizaje y uso para usuarios principiantes
Como has visto en los ejemplos anteriores, comenzar con Bash Scripts es bastante sencillo. Si tienes una ligera idea de cómo funciona la terminal de comandos y unas nociones básicas de programación, estamos seguros que podrás dominarlos en muy poco tiempo.
Cómo se crean los scripts en Bash
Hasta aquí hemos conocido la estructura básica de los scripts en Bash y hemos visto varios ejemplos de código. Ahora vamos a ver cómo crear ficheros para almacenar nuestros scripts.
Creación de un nuevo archivo de Script en Bash
La creación de los scripts se realiza en archivos de texto plano que deben tener la extensión .sh. Puedes crear los archivos usando cualquier editor de texto para programadores, aunque lo habitual es usar el propio terminal, con editores como Nano, Vim o Emacs.
El editor más sencillo para principiantes es Nano. Podríamos crear un script con este comando de terminal.
nano mi_script.sh
Declaración del intérprete y configuración de variables
En la primera línea del script Bash se declara el intérprete que ejecutará los comandos definidos a continuación en el fichero. Esto ya lo explicamos anteriormente y vimos ejemplos. De todos modos, la declaración del intérprete se hace con la línea:
#!/bin/bash
Luego podemos escribir comandos entre los que podrían figurar la creación de variables o la entrada de datos.
Escritura de comandos y funcionalidades del Script
A continuación tendremos el cuerpo del script, que consiste en comandos de Bash que ejecutan las tareas deseadas para automatizar los procesos.
Aquí tenemos todo el poder de nuestro terminal a disposición, así como cualquier herramienta que disponga una interfaz de línea de comandos.
Guardado y permisos de ejecución del Script
Algo muy importante para poder ejecutar los Bash Scripts es que los ficheros donde hemos guardado el código (a los que le pusimos la extensión .sh) tengan permisos de ejecución.
Puedes otorgar permisos de ejecución a los archivos con el siguiente comando:
chmod +x mi_script.sh
Ejecución y depuración del Script en el entorno de Bash
Después de haber creado el script y haber asignado los correspondientes permisos de ejecución, podemos ejecutarlo con el siguiente comando:
./mi_script.sh
Como has verificado, la ejecución del script se realiza invocándolo por el nombre del archivo que hayamos generado. Además tenemos que comenzar por «./» indicando que este archivo se encuentra en la carpeta actual.
También podríamos ejecutar el archivo indicando su ruta absoluta, con un comando como este:
sh ~/scripts/bash/nombre.sh
Comandos Bash
Ya introdujimos en un punto anterior los comandos Bash. Ahora vamos a nombrar algunos de los más habituales para la creación de nuestros scripts.
Comandos básicos de navegación y gestión de archivos
Podemos utilizar los comandos básicos de terminal que ya conocemos, como cd, ls, cp, y mv.
Este ejemplo realiza el volcado del listado del directorio actual en un archivo de texto cuyo nombre se ha almacenado en una variable.
#!/bin/bash archivo_destino='listado_directorio.txt' ls -l > '$archivo_destino' echo 'El listado del directorio ha sido guardado en '$archivo_destino''
Comandos para la gestión del sistema y procesos
Para la gestión de los procesos del sistema se usan comandos como top, ps, kill, y systemctl. Todos esos comandos permiten a los usuarios administrar procesos y servicios en el sistema. Cada uno tiene sus particularidades y usos. Por ejemplo, `ps aux` muestra todos los procesos en ejecución.
Comandos para la manipulación de texto y datos
La manipulación de texto y datos por medio de comandos del terminal es muy potente, incluso más de lo que podríamos imaginar. Para realizarla existen comandos y herramientas como grep, awk, sed, y cut.
Cada uno de esos comandos tiene múltiples utilidades como buscar, reemplazar, organizar y extraer datos contenidos en archivos de texto.
En el siguiente ejemplo veremos un script bash que recorre un archivo de log en busca de un término específico. En este script, en lugar de solicitar la entrada de datos mediante el comando read, hacemos uso de argumentos de entrada indicados al lanzar el comando.
#!/bin/bash # Verificación de los argumentos del script if [ '$#' -ne 2 ]; then echo 'Uso: $0 <archivo_de_log> <termino_de_busqueda>' exit 1 fi # Declaro variables con los argumentos de entrada archivo_log=$1 termino_busqueda=$2 echo 'Buscando el término '$termino_busqueda' en $archivo_log...' grep '$termino_busqueda' '$archivo_log' # verificamos si hubo coincidencias if [ $? -eq 0 ]; then echo 'Se encontraron coincidencias.' else echo 'No se encontraron coincidencias.' fi
Los argumentos de entrada que requiere este script Bash se indicarían como se puede ver a continuación.
./buscar_errores.sh /path/del/log/archivo.log 'Error'
Comandos para la interacción con redes y conexiones
Mediante scripts Bash también podemos interaccionar con redes y realizar conexiones con servidores remotos u otras máquinas en la red. Para ello podemos escribir comandos como
ping, ifconfig, netstat, scp o ssh, entre otros.
En este ejemplo podemos encontrar un útil comando de conexión a un servidor para descargar los ficheros de log de una aplicación Laravel.
#!/bin/bash SERVIDOR_REMOTO='usuario@direccion_servidor' DIRECTORIO_REMOTO='/var/www/example.com/storage/logs/' DIRECTORIO_LOCAL='/carpeta/destino' # Si no existe el destino, lo creo if [ ! -d '$DIRECTORIO_LOCAL' ]; then mkdir -p '$DIRECTORIO_LOCAL' fi echo 'Descargando archivos de log desde $SERVIDOR_REMOTO...' scp '$SERVIDOR_REMOTO:$DIRECTORIO_REMOTO*.log' '$DIRECTORIO_LOCAL'
Comandos avanzados y utilidades específicas de Bash
Cuando utilizamos scripts Bash tenemos todo el poder del terminal a nuestra mano. Podemos hacer automatizaciones realmente sofisticadas, que involucren distintos sistemas. Por ejemplo, copias de seguridad de los datos de una base de datos, que se podrían generar en un servidor remoto y luego enviar a otro servidor para su almacenamiento. Incluso podríamos empaquetar y comprimir varios backups con tar para un almacenamiento más eficiente.
Podemos asignar planificaciones de scripts de automatización a través del cron para programar tareas, para que esos cloud backups se realicen automáticamente y realizar envíos de notificaciones por email al administrador para indicar que las tareas han finalizado.
Esto es solo un pequeño ejemplo. Realmente las posibilidades no tienen fin. Dominar los Bash script no te costará demasiado esfuerzo y con ellos podrás ahorrarte mucho trabajo de administración en el día a día.