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#
- Sistema Linux (Ubuntu, Debian, CentOS, etc.)
- Terminal o consola de comandos
- Editor de texto (nano, vim, gedit, VS Code)
- Permisos de ejecucion para el script
Crear el Archivo del Script#
Primero, crea un archivo para tu script. Puedes hacerlo utilizando un editor de texto en tu sistema Linux:
nano menu_script.shExplicacion detallada del codigo#
1. Shebang#
#!/bin/bashEste 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)#
# Colores para mejorar la visualizacionRED='\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 ColorLos 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#
# Directorio de respaldoBACKUP_DIR="$HOME/backups"LOG_FILE="$HOME/script_log.txt"
# Crear directorio de respaldo si no existemkdir -p "$BACKUP_DIR"Definir variables al inicio del script facilita su mantenimiento y personalizacion.
4. Funcion para mostrar el menu#
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#
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#
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#
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#
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#
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#
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#
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#
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#
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#
log_action() { echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"}7. Estructura principal del menu#
# Bucle principalwhile 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 -rdoneCodigo completo#
DESCARGA: menu shell
Instalacion y ejecucion#
1. Crear el archivo#
nano menu_script.sh2. 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#
chmod +x menu_script.sh5. Ejecutar el script#
./menu_script.sh6. (Opcional) Crear un alias para ejecutar facilmente#
echo 'alias menu="./menu_script.sh"' >> ~/.bashrcsource ~/.bashrcAhora 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#
- Interfaz con colores para mejor visualizacion
- 9 opciones funcionales con comandos reales
- Sistema de logs para registrar acciones
- Copia de seguridad con timestamp
- Gestion de procesos basica
- Instalacion de paquetes (apt y pip)
- Compatibilidad con la mayoria de distribuciones Linux
Recomendaciones finales#
- Modifica las opciones segun tus necesidades
- Agrega mas funciones como gestion de usuarios o servicios
- Implementa validaciones para entradas de usuario
- Usa variables para rutas y configuraciones
- Manten un registro de los cambios
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
sudosolo cuando sea necesario.
