Crear menú en Bash Script

Los que trabajamos con GNU Linux, en mi caso Debian, tenemos nuestros scripts bash para ejecutar tareas de limpieza, backups… en este artículo vamos a ver cómo crear un menú en Bash Script para que nos pregunte que tarea realizar.

Pongamos un ejemplo calro para que lo entendamos. Supongamos que tenemos nuestro script para realizar las copias de seguridad de nuestro PC. Un simple script bash que ejecutat una de tras de otra, las órdenes para comprimir carpetas de nuestro PC y el fichero comprimido se almacene en una unidad externa.

Script copia de seguridad

Aquí tenéis el script que realiza las copias de seguridad:

#!/bin/bash
# Fichero backup-local.sh
FECHA=$(date +"%Y-%m-%d")

7z a -t7z /media/usuario/hddexterno/$FECHA-tmp.7z /home/usuario/tmp -mx9 -pContraseña;;
7z a -t7z /media/usuario/hddexterno/$FECHA-dropbox.7z /home/usuario/Dropbox -mx9 -pContraseña;;
7z a -t7z /media/usuario/hddexterno/$FECHA-tmp.7z /home/usuario/Documentos -mx9 -pContraseña;;        7z a -t7z /media/usuario/hddexterno/$FECHA-android.7z /home/usuario/AndroidStudio -mx9 -pContraseña;;

Si queréis ver un script más completo de backups, podéis visitar nuestro artículo Bash – Script para backup de carpetas desde consola.

Hasta aquí bien. Si ejecutamos el script, se irán ejecutando las cuatro órdenes seguidas. Una detrás de otra.

Crear menú para el script bash sencillo

Lo que haremos es un menú sencillo para que cuando lo ejecutemos, nos pregunte qué tarea de las cuatro queremos hacer.

#!/bin/bash
FECHA=$(date +"%Y-%m-%d")
echo "[ Seleccione opción de Backup]"
echo "1: tmp"
echo "2: dropbox"
echo "3: documents"
echo "4: android"

#leemos del teclado
read n

case $n in
        1) 7z a -t7z /media/usuario/hddexterno/$FECHA-tmp.7z /home/usuario/tmp -mx9 -pContraseña;;
        2) 7z a -t7z /media/usuario/hddexterno/$FECHA-dropbox.7z /home/usuario/Dropbox -mx9 -pContraseña;;
        3) 7z a -t7z /media/usuario/hddexterno/$FECHA-tmp.7z /home/usuario/Documentos -mx9 -pContraseña;; 
        4) 7z a -t7z /media/usuario/hddexterno/$FECHA-android.7z /home/usuario/AndroidStudio -mx9 -pContraseña;;
        *) echo "Opción incorrecta";;
esac

Si ejecutamos, se nos mostrará un menú como el de la imagen siguiente y esperará que el usuario pulse del 1 al 4 para escoger qué tarea realizar:

Mejoramos en dos cosas:

  • Si lo tenemos todo en un solo script, no tenemos porqué ejecutar todas las órdemes.
  • Para ejecutar las sentencias por separado, si no lo hacemos con un menú, deberíamos tener un ficher bash script para cada orden… no tiene sentido.

Crear menú Bash Script avanzado

Hay otra manera de hacerlo más técnica y avanzada, para los que quieran complicarse la vida un poco más. Aquí teneís una alternativa:

#!/bin/bash
FECHA=$(date +"%Y-%m-%d")

PS3= "[ Seleccione opción de Backup]"
options=("1" "2" "3" "Quit")
select opt in "${options[@]}"
do
    case $opt in
        1) 7z a -t7z /media/usuario/hddexterno/$FECHA-tmp.7z /home/usuario/tmp -mx9 -pContraseña;;
        2) 7z a -t7z /media/usuario/hddexterno/$FECHA-dropbox.7z /home/usuario/Dropbox -mx9 -pContraseña;;
        3) 7z a -t7z /media/usuario/hddexterno/$FECHA-tmp.7z /home/usuario/Documentos -mx9 -pContraseña;; 
        4) 7z a -t7z /media/usuario/hddexterno/$FECHA-android.7z /home/usuario/AndroidStudio -mx9 -pContraseña;;
        "Quit") break;;
        *) echo "Opción incorrecta";;
    esac
done

Espero que os sea de utilidad y así poder agrupar vuestros scripts en uno solo.


Más información