Skip to main content

Command Palette

Search for a command to run...

Bash scripting: de cero a scripts útiles en Linux

Tiempo de lectura: 10 minutos Categoría: Linux · Terminal Nivel: Principiante / Intermedio

Published
6 min read

Bash es el lenguaje de la terminal Linux. Aprenderlo es una de las inversiones más rentables que puedes hacer si trabajas con sistemas Linux, porque te permite automatizar tareas repetitivas, crear herramientas personalizadas y encadenar comandos de formas que serían imposibles manualmente. En este artículo te llevo de los fundamentos a scripts realmente útiles.

¿Qué es un script de Bash?

Un script de Bash es simplemente un archivo de texto que contiene una secuencia de comandos que se ejecutan uno tras otro. Es como escribir comandos en la terminal pero guardados en un archivo que puedes ejecutar cuando quieras y cuantas veces quieras.

La primera línea de cualquier script de Bash debe ser el shebang: una línea especial que empieza con los caracteres almohadilla y exclamación seguidos de la ruta al intérprete. Para Bash el shebang estándar es #!/usr/bin/env bash, que es más portable que #!/bin/bash porque busca Bash en el PATH en vez de asumir una ruta fija.

Para que un script sea ejecutable necesitas darle permisos de ejecución con chmod +x seguido del nombre del archivo. Luego puedes ejecutarlo con ./nombre-del-script.sh si estás en el mismo directorio, o con la ruta completa desde cualquier lugar.

Variables

Las variables en Bash se definen sin espacios alrededor del signo igual. Para leer el valor de una variable la precedes con el símbolo de dólar. Es importante no poner espacios alrededor del igual porque Bash los interpreta como separadores de argumentos y dará un error.

Por convención las variables de entorno del sistema se escriben en mayúsculas y las variables locales del script en minúsculas. Para hacer una variable de solo lectura usa la palabra clave readonly antes de la asignación.

Las variables especiales más útiles son $0 que contiene el nombre del script, $1 a $9 que contienen los argumentos que se pasan al script al ejecutarlo, $# que contiene el número de argumentos, $@ que contiene todos los argumentos como lista, y $? que contiene el código de salida del último comando ejecutado.

Entrada y salida

El comando echo imprime texto en la pantalla. Con el flag -n evita añadir un salto de línea al final. Con el flag -e interpreta secuencias de escape como \n para nueva línea y \t para tabulación.

El comando read lee una línea de la entrada estándar y la guarda en una variable. Con el flag -p puedes mostrar un prompt antes de leer. Con -s activa el modo silencioso que no muestra lo que escribe el usuario, útil para contraseñas.

Para redirigir la salida de un comando a un archivo usa el operador mayor que. Para añadir al final del archivo en vez de sobreescribirlo usa dos signos mayor que. Para redirigir la entrada de un archivo usa el operador menor que. El operador pipe dirige la salida de un comando como entrada del siguiente.

Condicionales

Las condicionales en Bash usan la estructura if, then, else y fi. La condición se evalúa con corchetes dobles que son la versión moderna y más segura de los corchetes simples.

Para comparar cadenas de texto usa el operador doble igual para igualdad y != para diferencia. Para comparar números usa -eq para igual, -ne para diferente, -lt para menor que, -le para menor o igual, -gt para mayor que y -ge para mayor o igual.

Para verificar archivos y directorios hay operadores específicos muy útiles: -f comprueba si existe un archivo regular, -d si existe un directorio, -e si existe cualquier cosa con ese nombre, -r si tiene permisos de lectura, -w de escritura y -x de ejecución.

El operador && ejecuta el segundo comando solo si el primero tuvo éxito. El operador || ejecuta el segundo solo si el primero falló. Estos operadores son muy útiles para escribir condiciones compactas en una sola línea.

Bucles

El bucle for itera sobre una lista de elementos. La sintaxis es for variable in lista; do comandos; done. La lista puede ser una secuencia de palabras, el resultado de un comando entre paréntesis de comando o una expansión de archivos con comodines.

El comando seq genera secuencias de números, muy útil para hacer bucles que se repiten un número determinado de veces.

El bucle while repite un bloque de comandos mientras una condición sea verdadera. El bucle until hace lo contrario, repite mientras la condición sea falsa.

Funciones

Las funciones te permiten reutilizar código dentro del script. Se definen con el nombre de la función seguido de paréntesis y un bloque de código entre llaves.

Dentro de una función los argumentos se acceden igual que los argumentos del script, con $1, $2 y así sucesivamente. El valor de retorno de una función es su código de salida, que puedes establecer con return seguido de un número entre 0 y 255. Para devolver un valor de texto usa echo dentro de la función y captura el resultado con sustitución de comandos.

Manejo de errores

Un script robusto maneja los errores correctamente. Añadir set -e al principio del script hace que se detenga inmediatamente si cualquier comando falla. Set -u hace que falle si se usa una variable sin definir. Set -o pipefail hace que un pipeline falle si cualquier comando de la cadena falla, no solo el último.

Verificar el código de salida de comandos críticos con $? y actuar en consecuencia es una buena práctica. También puedes usar trap para ejecutar código de limpieza cuando el script termina, ya sea con éxito o por un error.

Un script práctico: backup automatizado

Juntando todo lo que hemos visto podemos escribir un script de backup útil. El script verifica que el directorio de origen existe, crea el directorio de destino si no existe, genera un nombre de archivo con la fecha actual usando el comando date, copia el directorio comprimido con tar, verifica que la copia se completó correctamente comprobando el código de salida, y escribe un mensaje de éxito o error.

Este tipo de script combinado con cron que vimos en el artículo de Python da como resultado un sistema de backups automático completamente funcional.

Consejos para escribir buenos scripts

Añade comentarios explicando qué hace cada sección del script, especialmente las partes no obvias. Un script sin comentarios es difícil de mantener incluso para quien lo escribió.

Usa nombres de variables descriptivos. Una variable llamada source_dir es mucho más clara que una llamada sd o simplemente s.

Prueba el script con datos reales pero en un entorno seguro antes de ejecutarlo en producción. Añade mensajes de progreso para saber en qué punto está la ejecución, especialmente en scripts largos.

ShellCheck es una herramienta online y de línea de comandos que analiza scripts de Bash y señala problemas comunes de sintaxis y malas prácticas. Úsala antes de considerar un script terminado.

Conclusión

Bash scripting es una habilidad que se aprende haciendo. Empieza automatizando una tarea pequeña que hagas manualmente con frecuencia y ve añadiendo complejidad según la necesites.

Con el tiempo desarrollarás una biblioteca personal de funciones y scripts reutilizables que te ahorrarán horas de trabajo.


¿Cuál es el script de Bash más útil que has escrito? Compártelo en los comentarios.