Script de Menu en Bash - Guia completa y avanzada

Script de Menu en Bash - Guia completa y avanzada

Aprende a crear un script de menu en Bash para automatizar tareas como instalaciones, copias de seguridad y mas. Explicacion detallada paso a paso.

Crear un script de menu en Bash es una forma efectiva de automatizar tareas como instalaciones, ejecuciones y copias de seguridad. Bash, el interprete de comandos predeterminado en la mayoria de las distribuciones GNU/Linux, es accesible para principiantes y poderoso para usuarios avanzados. Esta combinacion lo convierte en una herramienta ideal para la automatizacion de procesos, facilitando tareas complejas y mejorando la eficiencia operativa.

Para entender mejor como funciona el script de menu en Bash que hemos diseñado, vamos a desglosar cada parte y explicar la funcion de cada seccion de codigo. Este desglose ayudara a comprender como cada componente interactua dentro del script para proporcionar una interfaz de menu funcional.


Requisitos previos#


Crear el Archivo del Script#

Primero, crea un archivo para tu script. Puedes hacerlo utilizando un editor de texto en tu sistema Linux:

Terminal window
nano menu_script.sh

Explicacion detallada del codigo#

1. Shebang#

#!/bin/bash

Este es el shebang. Le dice al sistema que este script debe ejecutarse usando Bash, que es el interprete de comandos estandar en muchos sistemas Linux. Esta linea debe ser la primera en cualquier script de Bash, asegurando que se interprete correctamente.

2. Colores y formato (Opcional pero recomendado)#

Terminal window
# Colores para mejorar la visualizacion
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
WHITE='\033[0;37m'
BOLD='\033[1m'
NC='\033[0m' # No Color

Los codigos de color permiten que el menu sea mas visual y facil de leer. NC se usa para resetear el color despues de cada uso.

3. Variables de configuracion#

Terminal window
# Directorio de respaldo
BACKUP_DIR="$HOME/backups"
LOG_FILE="$HOME/script_log.txt"
# Crear directorio de respaldo si no existe
mkdir -p "$BACKUP_DIR"

Definir variables al inicio del script facilita su mantenimiento y personalizacion.

4. Funcion para mostrar el menu#

Terminal window
show_menu() {
clear
echo "${BOLD}${CYAN}════════════════════════════════════════════════════════${NC}"
echo "${BOLD}${GREEN} MENU SCRIPT V.2.0 - BASH${NC}"
echo "${BOLD}${CYAN}════════════════════════════════════════════════════════${NC}"
echo ""
echo "${YELLOW} 1${NC} - Mostrar directorio actual"
echo "${YELLOW} 2${NC} - Mostrar informacion del sistema"
echo "${YELLOW} 3${NC} - Mostrar IP publica y local"
echo "${YELLOW} 4${NC} - Mostrar redes Wi-Fi disponibles"
echo "${YELLOW} 5${NC} - Mostrar claves Wi-Fi guardadas"
echo "${YELLOW} 6${NC} - Hacer copia de seguridad"
echo "${YELLOW} 7${NC} - Gestionar procesos"
echo "${YELLOW} 8${NC} - Instalar paquetes"
echo "${YELLOW} 9${NC} - Ver logs del sistema"
echo "${RED} 0${NC} - Salir"
echo ""
echo "${BOLD}${CYAN}════════════════════════════════════════════════════════${NC}"
echo -n "${BOLD}${WHITE}Escoge una opcion: ${NC}"
}

La funcion show_menu() limpia la pantalla y muestra el menu con colores y formato, haciendo que la interfaz sea mas atractiva y facil de usar.

5. Funciones para cada opcion#

Opcion 1: Mostrar directorio actual#

Terminal window
option_1() {
echo "${BOLD}${GREEN}Directorio actual:${NC}"
echo "${CYAN}$(pwd)${NC}"
echo ""
echo "${BOLD}${GREEN}Contenido:${NC}"
ls -la --color=always | head -20
echo ""
echo "${YELLOW}Usa 'ls -la' para ver todos los archivos${NC}"
}

Opcion 2: Informacion del sistema#

Terminal window
option_2() {
echo "${BOLD}${GREEN}Informacion del Sistema${NC}"
echo "${CYAN}══════════════════════════════════════${NC}"
echo "${BOLD}Hostname:${NC} $(hostname)"
echo "${BOLD}Kernel:${NC} $(uname -r)"
echo "${BOLD}Arquitectura:${NC} $(uname -m)"
echo "${BOLD}Distribucion:${NC} $(cat /etc/os-release | grep PRETTY_NAME | cut -d'"' -f2)"
echo "${BOLD}Uptime:${NC} $(uptime -p)"
echo "${BOLD}Usuarios conectados:${NC} $(who | wc -l)"
echo ""
echo "${BOLD}${GREEN}Memoria:${NC}"
free -h
echo ""
echo "${BOLD}${GREEN}Espacio en disco:${NC}"
df -h /
}

Opcion 3: Mostrar IP publica y local#

Terminal window
option_3() {
echo "${BOLD}${GREEN}Informacion de Red${NC}"
echo "${CYAN}══════════════════════════════════════${NC}"
echo "${BOLD}IP Local:${NC} $(hostname -I | awk '{print $1}')"
echo "${BOLD}IP Publica:${NC} $(curl -s ifconfig.me 2>/dev/null || echo "No disponible")"
echo ""
echo "${BOLD}${GREEN}Interfaces de red:${NC}"
ip -br addr | grep -v "lo"
}

Opcion 4: Mostrar redes Wi-Fi disponibles#

Terminal window
option_4() {
echo "${BOLD}${GREEN}Redes Wi-Fi disponibles${NC}"
echo "${CYAN}══════════════════════════════════════${NC}"
if command -v nmcli &> /dev/null; then
nmcli -t -f SSID,SIGNAL dev wifi list | head -20
elif command -v iwlist &> /dev/null; then
sudo iwlist wlan0 scan | grep -E "ESSID|Signal" | head -20
else
echo "${RED}No se encontro una herramienta para escanear redes${NC}"
fi
}

Opcion 5: Mostrar claves Wi-Fi guardadas#

Terminal window
option_5() {
echo "${BOLD}${GREEN}Claves Wi-Fi guardadas${NC}"
echo "${CYAN}══════════════════════════════════════${NC}"
echo "${YELLOW}Se necesita permisos de superusuario${NC}"
if command -v nmcli &> /dev/null; then
sudo nmcli -t -f NAME connection show --active
echo ""
echo "${YELLOW}Para ver la clave de una red especifica:${NC}"
echo "${CYAN}sudo nmcli -s connection show 'NOMBRE_RED' | grep 802-11-wireless-security.psk${NC}"
elif [ -f /etc/NetworkManager/system-connections/* ]; then
sudo cat /etc/NetworkManager/system-connections/* | grep -E "ssid|psk" | head -20
else
echo "${RED}No se encontraron redes guardadas${NC}"
fi
}

Opcion 6: Hacer copia de seguridad#

Terminal window
option_6() {
echo "${BOLD}${GREEN}Copia de seguridad${NC}"
echo "${CYAN}══════════════════════════════════════${NC}"
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
BACKUP_FILE="$BACKUP_DIR/backup_$TIMESTAMP.tar.gz"
echo "${YELLOW}Directorio de respaldo: $BACKUP_DIR${NC}"
echo "1 - Respaldar directorio home"
echo "2 - Respaldar directorio actual"
echo "3 - Respaldar carpeta especifica"
echo -n "Selecciona una opcion: "
read -r backup_option
case $backup_option in
1)
SOURCE_DIR="$HOME"
;;
2)
SOURCE_DIR="."
;;
3)
echo -n "Ruta de la carpeta a respaldar: "
read -r SOURCE_DIR
;;
*)
echo "${RED}Opcion invalida${NC}"
return
;;
esac
echo "${YELLOW}Creando respaldo...${NC}"
tar -czf "$BACKUP_FILE" -C "$(dirname "$SOURCE_DIR")" "$(basename "$SOURCE_DIR")" 2>/dev/null
if [ $? -eq 0 ]; then
echo "${GREEN}Respaldo creado exitosamente${NC}"
echo "${CYAN}Archivo: $BACKUP_FILE${NC}"
echo "${CYAN}Tamano: $(du -h "$BACKUP_FILE" | cut -f1)${NC}"
else
echo "${RED}Error al crear el respaldo${NC}"
fi
}

Opcion 7: Gestionar procesos#

Terminal window
option_7() {
echo "${BOLD}${GREEN}Gestion de procesos${NC}"
echo "${CYAN}══════════════════════════════════════${NC}"
echo "1 - Ver procesos en ejecucion"
echo "2 - Buscar proceso por nombre"
echo "3 - Matar proceso"
echo "0 - Volver"
echo -n "Selecciona una opcion: "
read -r process_option
case $process_option in
1)
echo "${BOLD}${GREEN}Procesos en ejecucion:${NC}"
ps aux --sort=-%mem | head -15
;;
2)
echo -n "Nombre del proceso a buscar: "
read -r process_name
echo "${BOLD}${GREEN}Resultados:${NC}"
ps aux | grep -i "$process_name" | grep -v grep
;;
3)
echo -n "PID del proceso a matar: "
read -r pid
echo -n "Matar proceso $pid? (s/n): "
read -r confirm
if [ "$confirm" = "s" ] || [ "$confirm" = "S" ]; then
kill -9 "$pid" 2>/dev/null
if [ $? -eq 0 ]; then
echo "${GREEN}Proceso $pid terminado${NC}"
else
echo "${RED}Error al terminar el proceso${NC}"
fi
fi
;;
0)
return
;;
*)
echo "${RED}Opcion invalida${NC}"
;;
esac
}

Opcion 8: Instalar paquetes#

Terminal window
option_8() {
echo "${BOLD}${GREEN}Instalacion de paquetes${NC}"
echo "${CYAN}══════════════════════════════════════${NC}"
echo "1 - Instalar paquete con apt"
echo "2 - Instalar paquete con pip (Python)"
echo "3 - Actualizar sistema"
echo "0 - Volver"
echo -n "Selecciona una opcion: "
read -r install_option
case $install_option in
1)
echo -n "Nombre del paquete a instalar: "
read -r package
echo "${YELLOW}Instalando $package...${NC}"
sudo apt update && sudo apt install -y "$package"
if [ $? -eq 0 ]; then
echo "${GREEN}Paquete $package instalado${NC}"
else
echo "${RED}Error al instalar $package${NC}"
fi
;;
2)
echo -n "Nombre del paquete Python: "
read -r package
echo "${YELLOW}Instalando $package...${NC}"
pip3 install "$package" 2>/dev/null || pip install "$package"
if [ $? -eq 0 ]; then
echo "${GREEN}Paquete $package instalado${NC}"
else
echo "${RED}Error al instalar $package${NC}"
fi
;;
3)
echo "${YELLOW}Actualizando sistema...${NC}"
sudo apt update && sudo apt upgrade -y
echo "${GREEN}Sistema actualizado${NC}"
;;
0)
return
;;
*)
echo "${RED}Opcion invalida${NC}"
;;
esac
}

Opcion 9: Ver logs del sistema#

Terminal window
option_9() {
echo "${BOLD}${GREEN}Logs del sistema${NC}"
echo "${CYAN}══════════════════════════════════════${NC}"
echo "1 - Ver logs del sistema (ultimas 20 lineas)"
echo "2 - Ver logs de autenticacion"
echo "3 - Ver logs de paquetes"
echo "4 - Ver logs personalizados del script"
echo "0 - Volver"
echo -n "Selecciona una opcion: "
read -r log_option
case $log_option in
1)
sudo journalctl -n 20 --no-pager
;;
2)
sudo tail -20 /var/log/auth.log 2>/dev/null || echo "${RED}Archivo no encontrado${NC}"
;;
3)
sudo tail -20 /var/log/dpkg.log 2>/dev/null || echo "${RED}Archivo no encontrado${NC}"
;;
4)
if [ -f "$LOG_FILE" ]; then
cat "$LOG_FILE"
else
echo "${YELLOW}No hay logs personalizados${NC}"
fi
;;
0)
return
;;
*)
echo "${RED}Opcion invalida${NC}"
;;
esac
}

6. Funcion para registrar acciones#

Terminal window
log_action() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"
}

7. Estructura principal del menu#

Terminal window
# Bucle principal
while true; do
show_menu
read -r opcion
case $opcion in
1)
clear
option_1
log_action "Opcion 1 ejecutada: Mostrar directorio"
;;
2)
clear
option_2
log_action "Opcion 2 ejecutada: Informacion del sistema"
;;
3)
clear
option_3
log_action "Opcion 3 ejecutada: Mostrar IP"
;;
4)
clear
option_4
log_action "Opcion 4 ejecutada: Redes Wi-Fi"
;;
5)
clear
option_5
log_action "Opcion 5 ejecutada: Claves Wi-Fi"
;;
6)
clear
option_6
log_action "Opcion 6 ejecutada: Copia de seguridad"
;;
7)
clear
option_7
log_action "Opcion 7 ejecutada: Gestion de procesos"
;;
8)
clear
option_8
log_action "Opcion 8 ejecutada: Instalar paquetes"
;;
9)
clear
option_9
log_action "Opcion 9 ejecutada: Ver logs"
;;
0)
echo ""
echo "${BOLD}${GREEN}Hasta luego!${NC}"
log_action "Script finalizado"
exit 0
;;
*)
echo ""
echo "${RED}Opcion invalida. Intenta de nuevo.${NC}"
sleep 1
;;
esac
echo ""
echo -n "${YELLOW}Presiona Enter para continuar...${NC}"
read -r
done

Codigo completo#

DESCARGA: menu shell


Instalacion y ejecucion#

1. Crear el archivo#

Terminal window
nano menu_script.sh

2. Pegar el codigo completo#

Copia todo el codigo y pegalo en el archivo.

3. Guardar y salir#

En nano: Ctrl + O, luego Enter, luego Ctrl + X

4. Hacer ejecutable el script#

Terminal window
chmod +x menu_script.sh

5. Ejecutar el script#

Terminal window
./menu_script.sh

6. (Opcional) Crear un alias para ejecutar facilmente#

Terminal window
echo 'alias menu="./menu_script.sh"' >> ~/.bashrc
source ~/.bashrc

Ahora solo escribe menu en la terminal.


Conclusion#

Este script de menu en Bash es un excelente punto de partida para los usuarios que deseen crear interfaces de usuario simples y efectivas sin profundizar en tecnicas de programacion mas complejas. Al entender como funciona cada parte del script, los usuarios pueden modificarlo para incluir nuevas opciones y funcionalidades, adaptandolo a sus necesidades especificas.

Caracteristicas principales#

Recomendaciones finales#

Reflexion final#

Con la practica, este tipo de scripting se convierte en una herramienta poderosa para la automatizacion y la gestion de sistemas. Bash es un lenguaje versatil que permite desde tareas simples hasta sistemas complejos de administracion.

Nota: Siempre respalda tus archivos antes de ejecutar scripts que modifiquen el sistema. Usa sudo solo cuando sea necesario.

Comunidad TodoReal

¿Te sirvió esta guía o herramienta?

Únete a nuestro canal en Telegram o WhatsApp para no perderte actualizaciones, nuevos servidores y guías avanzadas.

Comentarios

Comparte tu opinión sobre esta publicación.