Introducción
Este tutorial le guiará a través del proceso de comprensión y utilización de los arreglos clave-valor de Bash (también conocidos como arreglos asociativos) en sus scripts de shell. Los arreglos clave-valor son estructuras de datos potentes que le permiten almacenar y recuperar datos utilizando claves descriptivas en lugar de índices numéricos.
Al final de este tutorial, podrá crear, manipular y utilizar arreglos clave-valor en sus scripts de Bash para organizar datos de manera más efectiva y resolver problemas que serían difíciles con los arreglos numéricos tradicionales.
Creando su Primer Arreglo Clave-Valor de Bash
Los arreglos clave-valor de Bash (también llamados arreglos asociativos) le permiten asociar valores con claves específicas, de forma similar a los diccionarios en Python o a los objetos en JavaScript. Esto los hace ideales para almacenar datos estructurados donde los elementos se identifican por nombres en lugar de posiciones.
Sintaxis Básica
Para trabajar con arreglos clave-valor en Bash, primero debe declararlos utilizando la opción -A:
declare -A myarray
Esto crea un arreglo clave-valor vacío llamado myarray. La bandera -A le indica específicamente a Bash que se trata de un arreglo asociativo (clave-valor).
Añadiendo Elementos al Arreglo
Creemos un arreglo clave-valor para almacenar información sobre diferentes frutas:
- Abra una nueva terminal en el WebIDE si aún no está abierta
- Cree un nuevo archivo de script haciendo clic en "File > New File" en el WebIDE
- Guarde el archivo como
fruit_array.shen el directorio/home/labex/project - Agregue el siguiente código al archivo:
#!/bin/bash
## Declare a key-value array
declare -A fruits
## Add elements to the array
fruits["apple"]="red"
fruits["banana"]="yellow"
fruits["grape"]="purple"
fruits["orange"]="orange"
## Print a specific element
echo "The color of an apple is ${fruits["apple"]}"
## Print all values
echo "All fruit colors: ${fruits[@]}"
## Print all keys
echo "All fruits: ${!fruits[@]}"
- Guarde el archivo (Ctrl+S o File > Save)
- Haga que el script sea ejecutable con el siguiente comando en la terminal:
chmod +x fruit_array.sh
- Ejecute el script:
./fruit_array.sh
Debería ver una salida similar a esta:
The color of an apple is red
All fruit colors: red yellow purple orange
All fruits: apple banana grape orange
Entendiendo la Salida
${fruits["apple"]}: Esta sintaxis recupera el valor asociado con la clave "apple"${fruits[@]}: Esto devuelve todos los valores en el arreglo${!fruits[@]}: El símbolo!antes del nombre del arreglo devuelve todas las claves en el arreglo
Los arreglos clave-valor de Bash le permiten acceder a los datos directamente utilizando nombres significativos en lugar de tener que recordar posiciones numéricas, lo que hace que sus scripts sean más legibles y mantenibles.
Manipulación de Arreglos Clave-Valor de Bash
Ahora que comprende los conceptos básicos de los arreglos clave-valor, exploremos cómo manipularlos. En este paso, aprenderá a modificar valores existentes, agregar nuevos elementos, eliminar elementos y verificar si una clave existe.
Creando un Nuevo Script
- Cree un nuevo archivo llamado
array_operations.shen el directorio/home/labex/project - Agregue el siguiente código al archivo:
#!/bin/bash
## Declare a key-value array
declare -A user_info
## Add initial elements
user_info["name"]="John Doe"
user_info["email"]="john@example.com"
user_info["age"]="30"
user_info["city"]="New York"
## Display initial array content
echo "--- Initial user information ---"
for key in "${!user_info[@]}"; do
echo "$key: ${user_info[$key]}"
done
## Modify an existing value
user_info["age"]="31"
## Add a new key-value pair
user_info["country"]="USA"
## Check if a key exists
if [[ -v user_info["email"] ]]; then
echo -e "\nEmail exists: ${user_info["email"]}"
else
echo -e "\nEmail does not exist"
fi
## Remove an element
unset 'user_info[city]'
## Display the modified array
echo -e "\n--- Modified user information ---"
for key in "${!user_info[@]}"; do
echo "$key: ${user_info[$key]}"
done
## Count the number of elements
echo -e "\nNumber of elements: ${#user_info[@]}"
- Guarde el archivo (Ctrl+S o File > Save)
- Haga que el script sea ejecutable:
chmod +x array_operations.sh
- Ejecute el script:
./array_operations.sh
Debería ver una salida similar a esta:
--- Initial user information ---
name: John Doe
email: john@example.com
age: 30
city: New York
Email exists: john@example.com
--- Modified user information ---
name: John Doe
country: USA
email: john@example.com
age: 31
Number of elements: 4
Operaciones Clave Explicadas
- Modificación de valores: Simplemente asigne un nuevo valor a una clave existente:
user_info["age"]="31" - Añadiendo nuevos elementos: Use la misma sintaxis que la asignación inicial:
user_info["country"]="USA" - Verificando si una clave existe: Use el operador de prueba
-v:[[ -v user_info["email"] ]] - Eliminando elementos: Use el comando
unset:unset 'user_info[city]' - Contando elementos: Use
${#array[@]}para obtener el número de elementos - Iterando a través de elementos: Use un bucle for con
${!array[@]}para obtener todas las claves
Observe cómo el par clave-valor city se elimina en la salida modificada, y se ha agregado un nuevo par clave-valor country. Además, el valor de age se ha actualizado de 30 a 31.
Estas operaciones son esenciales cuando se trabaja con datos dinámicos en sus scripts, lo que le permite actualizar la información según sea necesario.
Creando un Administrador de Configuración Práctico
Ahora que comprende cómo crear y manipular arreglos clave-valor, construyamos algo práctico. En este paso, creará un administrador de configuración simple que carga la configuración de un archivo de configuración, la almacena en un arreglo clave-valor y le permite acceder a ella.
Paso 1: Crear un Archivo de Configuración
Primero, creemos un archivo de configuración con algunas configuraciones de ejemplo:
- Cree un nuevo archivo llamado
app_config.txten el directorio/home/labex/project - Agregue el siguiente contenido al archivo:
database_host=localhost
database_port=3306
database_user=admin
database_password=secret123
app_name=MyAwesomeApp
debug_mode=true
max_connections=100
- Guarde el archivo
Paso 2: Crear el Script del Administrador de Configuración
Ahora, creemos un script que leerá este archivo de configuración y almacenará su contenido en un arreglo clave-valor:
- Cree un nuevo archivo llamado
config_manager.shen el directorio/home/labex/project - Agregue el siguiente código al archivo:
#!/bin/bash
## Define the path to the configuration file
CONFIG_FILE="/home/labex/project/app_config.txt"
## Declare a key-value array for the configuration
declare -A config
## Function to load configuration from file
load_config() {
local file=$1
## Check if the file exists
if [[ ! -f "$file" ]]; then
echo "Error: Configuration file '$file' not found."
return 1
fi
## Read the file line by line
while IFS='=' read -r key value; do
## Skip empty lines and comments
if [[ -z "$key" || "$key" == \#* ]]; then
continue
fi
## Store the key-value pair in the array
config["$key"]="$value"
done < "$file"
echo "Configuration loaded successfully from '$file'"
return 0
}
## Function to get a configuration value
get_config() {
local key=$1
local default=$2
## Check if the key exists
if [[ -v config["$key"] ]]; then
echo "${config["$key"]}"
else
echo "$default"
fi
}
## Function to display all configuration
display_config() {
echo "--- Configuration Settings ---"
for key in "${!config[@]}"; do
echo "$key = ${config[$key]}"
done
}
## Load the configuration
load_config "$CONFIG_FILE"
## Display all configuration settings
display_config
## Example of getting specific configuration values
echo -e "\n--- Example Usage ---"
db_host=$(get_config "database_host" "127.0.0.1")
db_port=$(get_config "database_port" "5432")
db_user=$(get_config "database_user" "root")
db_pass=$(get_config "database_password" "")
app_name=$(get_config "app_name" "DefaultApp")
debug_mode=$(get_config "debug_mode" "false")
echo "Database connection: $db_user@$db_host:$db_port"
echo "Application name: $app_name"
echo "Debug mode: $debug_mode"
## Example of getting a non-existent value (will use default)
timeout=$(get_config "connection_timeout" "30")
echo "Connection timeout: $timeout (default value used)"
- Guarde el archivo (Ctrl+S o File > Save)
- Haga que el script sea ejecutable:
chmod +x config_manager.sh
- Ejecute el script:
./config_manager.sh
Debería ver una salida similar a esta:
Configuration loaded successfully from '/home/labex/project/app_config.txt'
--- Configuration Settings ---
database_host = localhost
database_port = 3306
database_user = admin
database_password = secret123
app_name = MyAwesomeApp
debug_mode = true
max_connections = 100
--- Example Usage ---
Database connection: admin@localhost:3306
Application name: MyAwesomeApp
Debug mode: true
Connection timeout: 30 (default value used)
Entendiendo el Administrador de Configuración
El script que ha creado hace varias cosas importantes:
- Lee pares clave-valor de un archivo de configuración
- Almacena estos pares en un arreglo clave-valor
- Proporciona funciones para:
- Cargar la configuración de un archivo
- Obtener valores de configuración específicos con valores predeterminados de respaldo
- Mostrar todas las configuraciones
Este patrón se usa comúnmente en aplicaciones del mundo real para administrar la configuración. Los beneficios clave son:
- Configuración centralizada: Todas las configuraciones están en un solo lugar
- Valores predeterminados: Si falta una configuración, se puede usar un valor predeterminado
- Fácil acceso: Se puede acceder a la configuración por nombre
- Flexibilidad: La configuración se puede actualizar sin cambiar el script
Este ejemplo demuestra cómo se pueden usar los arreglos clave-valor para resolver problemas prácticos en el scripting de shell. Podría extender esto agregando funciones para guardar los cambios de nuevo en el archivo de configuración o para validar la configuración.
Construyendo un Script Impulsado por Menú con Arreglos Clave-Valor
En este paso final, crearemos un script práctico impulsado por menú que utiliza arreglos clave-valor para almacenar y procesar las selecciones del usuario. Este ejemplo demuestra cómo se pueden usar los arreglos clave-valor para crear aplicaciones de línea de comandos más interactivas y fáciles de usar.
Creando el Sistema de Menú
- Cree un nuevo archivo llamado
menu_system.shen el directorio/home/labex/project - Agregue el siguiente código al archivo:
#!/bin/bash
## Declare a key-value array for menu options
declare -A menu_options
menu_options["1"]="Display system information"
menu_options["2"]="Check disk usage"
menu_options["3"]="List running processes"
menu_options["4"]="View network connections"
menu_options["q"]="Quit"
## Declare a key-value array for commands to execute
declare -A menu_commands
menu_commands["1"]="display_system_info"
menu_commands["2"]="check_disk_usage"
menu_commands["3"]="list_processes"
menu_commands["4"]="view_network"
## Function to display system information
display_system_info() {
echo -e "\n--- System Information ---"
echo "Hostname: $(hostname)"
echo "Kernel version: $(uname -r)"
echo "System uptime: $(uptime -p)"
echo "CPU information: $(grep 'model name' /proc/cpuinfo | head -1 | cut -d ':' -f 2 | xargs)"
echo "Total memory: $(free -h | grep Mem | awk '{print $2}')"
}
## Function to check disk usage
check_disk_usage() {
echo -e "\n--- Disk Usage ---"
df -h | grep -v tmp
}
## Function to list running processes
list_processes() {
echo -e "\n--- Top 10 Processes by Memory Usage ---"
ps aux --sort=-%mem | head -11
}
## Function to view network connections
view_network() {
echo -e "\n--- Active Network Connections ---"
netstat -tuln | grep LISTEN
}
## Function to display the menu
display_menu() {
echo -e "\n=== System Utility Menu ==="
for key in 1 2 3 4 q; do
echo "$key. ${menu_options[$key]}"
done
echo -e "\nPlease enter your choice:"
}
## Main loop
while true; do
## Display the menu
display_menu
## Read user choice
read -r choice
## Check if choice is valid
if [[ -v menu_options["$choice"] ]]; then
## Exit if user chose quit
if [[ "$choice" == "q" ]]; then
echo "Exiting. Goodbye!"
exit 0
fi
## Execute the corresponding command
if [[ -v menu_commands["$choice"] ]]; then
## Call the function associated with the choice
${menu_commands["$choice"]}
fi
else
echo "Invalid option. Please try again."
fi
## Pause for user to read output
echo -e "\nPress Enter to continue..."
read -r
done
- Guarde el archivo (Ctrl+S o File > Save)
- Haga que el script sea ejecutable:
chmod +x menu_system.sh
- Ejecute el script:
./menu_system.sh
- Pruebe las diferentes opciones del menú ingresando el número correspondiente, luego presione Enter cuando se le solicite para volver al menú. Ingrese
qpara salir del programa cuando haya terminado.
Entendiendo el Sistema de Menú
Este script demuestra varios usos avanzados de los arreglos clave-valor:
- Opciones de Menú: El arreglo
menu_optionsmapea los números de opción al texto descriptivo - Mapeo de Comandos: El arreglo
menu_commandsmapea los números de opción a los nombres de las funciones - Ejecución Dinámica: El script usa el valor de un arreglo para determinar qué función llamar
Los beneficios de usar arreglos clave-valor en este sistema de menú incluyen:
- Mantenibilidad: Agregar o modificar las opciones del menú solo requiere actualizar los arreglos
- Legibilidad: El código muestra claramente qué comando corresponde a qué opción del menú
- Flexibilidad: Puede reordenar fácilmente los elementos del menú sin cambiar las llamadas a las funciones
Este patrón es útil para crear herramientas interactivas de línea de comandos que son fáciles de mantener y extender.
Conclusiones Clave
A lo largo de este tutorial, ha aprendido:
- Cómo crear e inicializar arreglos clave-valor en Bash
- Cómo acceder, modificar y eliminar elementos de arreglos clave-valor
- Cómo iterar a través de claves y valores en un arreglo clave-valor
- Cómo usar arreglos clave-valor para almacenar datos de configuración
- Cómo crear un sistema de menú interactivo usando arreglos clave-valor
Estas técnicas se pueden aplicar a una amplia gama de tareas de scripting de shell, desde el almacenamiento de datos simple hasta aplicaciones interactivas complejas.
Resumen
En este tutorial, ha explorado el poder y la versatilidad de los arreglos clave-valor de Bash. Comenzando con lo básico, aprendió a crear y acceder a arreglos clave-valor, luego progresó a operaciones más avanzadas, como modificar, agregar y eliminar elementos.
Aplicó este conocimiento para crear ejemplos prácticos, incluido un administrador de configuración que lee la configuración de un archivo y un script de utilidad impulsado por menú que demuestra cómo se pueden usar los arreglos clave-valor para crear aplicaciones interactivas de línea de comandos.
Los arreglos clave-valor proporcionan una forma poderosa de organizar y acceder a los datos en sus scripts de Bash. La capacidad de usar claves descriptivas en lugar de índices numéricos hace que sus scripts sean más legibles y fáciles de mantener, especialmente cuando se trata de estructuras de datos complejas.
Ahora que tiene una sólida comprensión de los arreglos clave-valor en Bash, puede usarlos para mejorar sus scripts de shell y resolver una amplia gama de desafíos de programación de manera más eficiente.



