Appearance
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.exportse 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 deexport) obteniendo el año basado en el comandodatey un formato. Además, se usa$( )para incoporar un comando (date) y asignar resultado a una variable.
Luego se captura la variableownercon el comandoready 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
chmodse 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"
fiNótese que se usa
if ...; then ... else ... ficomo estructura de una condición (if then) con su camino alterno (else), terminando enfi
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
doneNótese que se usa
while ...; do ... donecomo estructura de un bucle (while do) terminando endone, cuya condición es que el número sea mayor o igual (-ge) a cero:[ $num -ge 0 ]
También encontramos el uso deshufpara obtener número aleatorio (entre 5 y 30), ysleeppara 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!"
fiNó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 comoexit(para interrumpir proceso),mkdir(para crear directorio),tar(para respaldar archivos) ydate(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@latestComo alternativa en Linux o macOS se podría usar
brew install gum
Y en Windowswinget 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 3Nótese que se incluyen comandos de
gumen un Script.gum confirmpresenta un dialogo de confirmación (yes/no).gum spinrepresenta 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'