Skip to content

Bash ​

Interprete y Lenguaje de Script

En el sistema operativo Unix tuvo lugar un interprete de línea de comandos conocido como Bourne Shell. Unos años después se liberó una versión libre que se le dió el nombre de BASH, que significa en inglés: Bourne Again Shell

Cuando hablamos de Bash no solo se trata de un interprete de comandos que se encuentra actualmente en sistemas como Linux y macOS, sino también un lenguaje de Script.

Actualmente, con el uso de máquinas virtuales y contenedores de aplicaciones (con herramientas como Docker o PodMan), además DevOps, puede ser muy útil conocer de Bash Scripting.

Esta es una guía esencial para iniciar con Bash basado en algunos ejemplos y partiendo del prerequisito de un conocimiento mínimo en lógica de programación, algún contacto con la terminal de Linux y comandos de dicho sistema.

Comenzando con Bash ​

Puedes usar Bash si cuentas con sistemas como Linux, macOS, en Windows 10+ con WSL (Windows Subsystem for Linux) o el interprete Git-Bash que acompaña la instalación de Git, incluso otro emulador de consola como ConEmu.

Si estas en Linux o macOS procedemos a abrir la terminal. En Windows 10+, teniendo WSL previamente instalado, usas la terminal y puedes ejecutar la sentencia bash (o las otras opciones antes mencionadas).

Para ir al punto, lo primero que haremos es que imprima algo en la terminal, así:

bash
echo "Hi there!"

Podemos definir una variable en el entorno del sistema usando export y el operador = para asigar un valor y luego imprimirlo con echo. Por ejemplo:

bash
export OWNER="John Doe"
echo "Hi $OWNER!"

Ten presente que al usar la línea de comandos cada comando se ejecuta separado, uno tras otro usando la tecla Enter.
export se ha usado como comando para establecer una variable pero se omite en archvos de Script

Lo siguiente es crear un archivo de script que contiene sentencias de Bash, el cual inicia con un encabezado #!/bin/bash. Además, esta vez usaremos read para capturar un dato de entrada. Veamos:

bash
#!/bin/bash
year=$(date +%y)
echo "Your name please ?... "
read owner
echo "Hi $owner! You are in $year"

En la segunda línea se hace una asignación a la variable year (sin necesidad de export) obteniendo el año basado en el comando date y un formato. Además, se usa $( ) para incoporar un comando (date) y asignar resultado a una variable.
Luego se captura la variable owner con el comando read y se aplica una salida de pantala.

El contenido anterior lo colocamos en un archivo que podemos llamar script1.sh, lo guardamos y luego ejecutamos lo siguiente:

bash
chmod +x script1.sh
./script1.sh

chmod se usa para asignar privilegios de ejecución, para poder lanzar el Script. Será necesario usarlo con cada Script que se cree, o en su defecto probar: sh script1.sh

Adicionalmente, se pueden incluir sentencias del sistema operativo con un control de flujo (condicionales y ciclos)

Condicional en Bash ​

En el siguiente ejemplo usaremos alguna condición con la sentencia if. Abre un archivo nuevo que podemos llamar script2.sh, el cual tendrá el siguiente contenido:

bash
#!/bin/bash
year=$(date +%y)
if (( year % 4 == 0 && ( year % 100 != 0 || year % 400 == 0 ) )); then
    echo "$year is a leap year with 366 days"
else
    echo "$year is a year with 365 days"
fi

Nótese que se usa if ...; then ... else ... fi como estructura de una condición (if then) con su camino alterno (else), terminando en fi
En otras condiciones generales se puede usar corchetes [ ] en lugar de doble paréntesis (( )) para incorporar criterios, guardando un espacio en cada lado de los corchetes (sin unir el criterio)

Bucle en Bash ​

A continuación veremos un ejemplo en el que se asigna un número aleatorio y se hace un conteo regresivo. Para ello abrimos un nuevo archivo que podemos llamar script3.sh, el cual tendrá el siguiente contenido:

bash
#!/bin/bash
num=$(shuf -i 5-30 -n 1)
while [ $num -ge 0 ]; do
    echo $num
    num=$((num - 1))
    sleep 1
done

Nótese que se usa while ...; do ... done como estructura de un bucle (while do) terminando en done, cuya condición es que el número sea mayor o igual (-ge) a cero: [ $num -ge 0 ]
También encontramos el uso de shuf para obtener número aleatorio (entre 5 y 30), y sleep para esperar un segundo. Además de una operación aritmética de decremento: num=$((num - 1))

Ejemplo de un Script de respaldo con Bash ​

Para ilustrar el pontencial de Bash Scripting, veamos un ejemplo en el que se toma una carpeta de origen para respaldar sus archivos, comprimiéndolos y llevandolos a un carpeta destino...

bash
#!/bin/bash
folder="/home/user/folder"
target="target/backup"
secuence=$(date +"%Y-%m-%d")
filename="backup_$secuence.tar.gz"

# Verify source directory
if [ ! -d "$folder" ]; then
    echo "Error: Directory not found."
    exit 1
fi

# Check target directory
mkdir -p "$target"

# Backup the files
tar -czf "$target/$filename" -C "$(dirname $folder)" "$(basename $folder)"

# Output
if [ $? -eq 0 ]; then
    echo "Backup susscesfull -> $target/$filename"
else
    echo "Backup failed!"
fi

Nótese que se han incorporando comentarios de código comenzado líneas con #.
En el criterio inicial se verifica si el directorio existe usando: [ ! -d "$folder" ].
Se han usado comandos del sistema como exit (para interrumpir proceso), mkdir (para crear directorio), tar (para respaldar archivos) y date (aplicándole formato a la fecha)

Para probarlo copia el contendio en un archivo, nombrandolo script4.sh, por ejemplo. Recuerda ajustar los valores de las de las rutas con las variables respectivas.

Gum por Charmbracelet ​

Gum es una utilidad escrita en leguaje Go que potencia Scripts de Bash cuando se trata de interactuar con el usuario, al proveer una serie de comandos (o elementos de interfaz) para mejorar la experiencia desde la terminal.

Estamos hablando de incorporar en nuestros Scripts comandos como los siguientes: choose, confirm, input, write, filter, file, format, table, log, style

Para instalar Gum, si tienes Go instalado, puedes ejecutar desde una terminal lo siguiente:

bash
go install github.com/charmbracelet/gum@latest

Como alternativa en Linux o macOS se podría usar brew install gum
Y en Windows winget install charmbracelet.gum

Para probarlo podemos utilizar la siguiente sentencia:

bash
gum choose "Blue" "Green" "Pink" "Red" "White" "Yellow"

Este comando nos permitirá elegir un elemento de la lista de opciones

Veamos el ejemplo de un Script con comandos de Gum...

bash
#!/bin/bash
echo "Choose a Color..."
COLOR=$(gum choose "Blue" "Green" "Pink" "Red" "White" "Yellow")
gum confirm "Do you choose $COLOR? (yes for spinner)" && \
gum spin --spinner dot --title "Imagine a process..." -- sleep 3

Nótese que se incluyen comandos de gum en un Script.
gum confirm presenta un dialogo de confirmación (yes/no).
gum spin representa una espera de modo gráfico.

Podríamos incluso sustituir la sentencia echo (usada en la segunda línea) por: gum style --foreground 255 'Choose a Color'