Bash: variables de variables - Userlinux.net

Estaba creando un pequeño script en BASH en el que necesitaba variables a partir de los nombres de otras variables, en tres palabras, variables de variables. Pensé que sería sencillo, cuestión de jugar un poco con los caracteres que definen las variables -$(){}- no debería complicarse demasiado. Sin embargo el…

Bash: variables de variables

23.Jun.2010 ~ 4 Comentarios ~ 1206 Lecturas

Estaba creando un pequeño script en BASH en el que necesitaba variables a partir de los nombres de otras variables, en tres palabras, "variables de variables". Pensé que sería sencillo, cuestión de jugar un poco con los caracteres que definen las variables -$(){}- no debería complicarse demasiado.

Sin embargo el método chino de prueba/error no sirvió de mucho porque despues de un buen rato seguía como al principio pero con menos paciencia y nulas ganas de perder más tiempo navegando entre manuales, Google y otros recursos que no me hacían avanzar.

Las alternativas, preguntar al amigo Juanjo (en cierto modo el script tenía relación con él), desconectar durante un rato y/o matar a un gatito. Visto que la última no era ni justa ni real -ni lo admitiría aunque lo hubiese hecho-, las dos anteriores si consiguieron sus frutos:

CTL_LIST=([APACHE]=/etc/init.d/whatever [BIND]=/etc/init.d/whatever2);
SERVICIO=APACHE;
CMD=${CTL_LIST[$SERVICIO]};
echo $CMD

En principio aunque la idea era buena, queda demasiado feo puesto que los índices en BASH deben ser numéricos, usar índices para los servicios no era adecuado (admito BASH como no-lenguaje de programación, y si, se podría hacer con Ruby, Perl, Python... pero ya era más cuestión de resolver el crucigrama que de una simple elección).

APACHE_CTL="/etc/init.d/apache2"
CMD="${1}_CTL"
echo ${!CMD}

Al final la solución era sencilla: ${!CMD} y usar adecuadamente las comillas. Así que aquí queda, documentado, para que -espero- alguien lo encuentre en caso de querer usar "variables de variables en bash" y no tenga que dar tantas vueltas como yo he hecho.

Está claro que desconectar y obtener distintas opiniones de un crucigrama es bueno y nos hace cambiar la perspectiva de lo que se plantea.

Categorías: programación
Tags: bash script

Comentarios


gravatar
23.Jun.2010
Vamos, que mi propuesta estaba mal: no se pueden crear vectores asociativos en BASH, solo se pueden indexar por número.

No solo tu propuesta es más clara, sino que además... ¡es correcta!

gravatar
Slackita
24.Jun.2010


A la vieja usanza: APACHE_CTL="/etc/init.d/apache2" eval CMD=\$$1_CTL echo $CMD


gravatar
Slackita
24.Jun.2010
Falta una contrabarra después de CMD=

gravatar
24.Jun.2010
@reidrac: Fuere correcta o no tu solución abrió las puertas a la "mía", por lo que podemos dar por zanjado el crucigrama, que era lo importante. Graccie :P

@Slackita: Lo había visto por ahí, pero quería evitar el eval... demasiado "a la vieja usanza" como dices. Eso si, ambas soluciones son válidas :).

Comentarios


Los comentarios están cerrados: los comentarios se cierran automáticamente una vez pasados 15 días. Si quieres comentar algo acerca de la anotación, puedes hacerlo por e-mail.

Buscar

Cargando...

Últimos comentarios

  • Juan
  • Marina
  • Francisco
  • fon
  • minWi
  • isra
  • reidrac
  • r0sk
  • Rodrigo Rega
  • minWi
  • r0sk
  • reidrac
  • r0sk
  • deady
  • errece

Moneting

Valor de mi cuenta de Facebook según Moneting
Valor de mi cuenta de Twitter según Moneting

Tagcloud

ssh frases champions userlinux iphone lugo rsidenotes felicidades films nintendo opinion sysadmin 2008 blogsfera vacaciones juegos cake ds debian sidenotes apple web blogs mac mysql cakephp deportes 2007 mundial openbsd barça ubuntu twitter blog humor meme canción alemania_2006 games bsd lucux linux twitt programación cumpleaños software django league bash macosx ps3 rfilms conciertos freebsd seguridad personal hack php bake futbol

Archivo

Social

Enlaces de interés