La combinación de arrays e indirección de variables demuestra toda la potencia del método. Es especialmente útil para crear archivos de configuración coherentes, fáciles de modificar, potentes y flexibles, pero sobre todo, que no necesitan ser parseados, el mismo Bash se encarga de eso en forma trasparente, por lo tanto la probabilidad de bugs disminuye notoriamente. El siguiente ejemplo demuestra la configuración de un pequeño programa utilizando arrays e indirección de variables:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#!/bin/bash # Archivo de configuración: pruebaservidores.conf servidores=( srvmysql srvapache ) srvmysql_config=( nombre=SrvMySQL ip=172.16.2.1 ) srvapache_config=( nombre=SrvApache ip=172.16.2.4 ) |
A continuación el programa principal :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
#!/bin/bash # Programa principal: pruebaservidores.sh source pruebaservidores.conf function probarServidor() { # Esta es la función que hace la "magia" # usando indirección de variables # Crea una variable local con el nombre del array # que contiene la configuración del servidor local servidor="$1[*]" # Itera cada elemento de la configuración # creando variables locales, usando indirección for config in ${!servidor} do # Crea instancias locales a partir de los elemntos # del array que configura cada servodr local $config done # Ahora cada elemento del array es una variable usable localmente echo $nombre $(ping -c 5 $ip | grep -o "[0-9]*% packet loss") } function probarTodo() { local servidor for servidor in ${servidores[*]} do local srvconfig="${servidor}_config" probarServidor $srvconfig unset srvconfig done } probarTodo |
Como se puede apreciar, el programa tiene un archivo de configuración que casi no requiere ningun esfuerzo de programación adicional para leer la configuración del usaurio, y éste a su vez encuentra una estructura de configuración sumamente intuitiva y fácil de adaptar a sus necesidades particulares, pudiendo incluso incorporar lógica de proceso en caso de ser un usuario técnico y tener un buen motivo para hacerlo.