Ayer por la tarde estuve ayudando a un compañero con un problemita en un script. El desafío consistía en construir y guardar en una variable el texto correspondiente a un comando. Como dificultad adicional, vi que uno de los valores que acompañaban a una de las opciones de este comando consistía en una cadena encerrada entre comillas simples. Luego de algunas pruebas encontramos la solución – la cual consistió en usar eval
para ejecutar como comando una cadena de texto o el contenido de una variable.
Usar eval
Esta herramienta es un built-in de Bash. Por eso, no encontraremos un man page sobre la misma – pero podemos utilizar la ayuda disponible en el de Bash.
En el caso concreto que nos ocupó ayer, necesitábamos construir el siguiente comando y guardarlo dentro de la variable folderItems:
curl -s https://api.box.com/2.0/folders/39763952117/items?fields=name -H 'Authorization: Bearer sT9FbERWT3HLR02OOsa6hDHY6lBSZRGz'
Como prueba inicial, guardamos la cadena sT9FbERWT3HLR02OOsa6hDHY6lBSZRGz dentro de la variable token:
token=sT9FbERWT3HLR02OOsa6hDHY6lBSZRGz
A continuación, construimos la cadena completa con la ayuda de echo
(otro built-in de Bash):
folderItems=$(echo curl -s https://api.box.com/2.0/folders/39763952117/items?fields=name -H "'Authorization: Bearer "$token"'")
En la línea anterior tenemos que reparar en el uso de las comillas. En primer lugar, consideremos la siguiente cadena:
"'Authorization: Bearer "
la cual produce el siguiente resultado:
'Authorization: Bearer
Por otro lado,
$token"'"
equivale a
sT9FbERWT3HLR02OOsa6hDHY6lBSZRGz'
Por lo tanto, cuando combinamos
"'Authorization: Bearer "$token"'"
obtuvimos
'Authorization: Bearer sT9FbERWT3HLR02OOsa6hDHY6lBSZRGz'
que era exactamente lo que necesitábamos. Con eso ya teníamos mitad de la cuestión solucionada. Ahora era momento de ver cómo ejecutábamos el comando cuyo texto completo estaba ya guardado dentro de la variable.
Ejecutar el comando
Luego de verificar que la variable folderItems contenía el comando correcto, utilizamos eval
para ejecutarlo. Para hacerlo, solamente fue necesario incluir la siguiente línea en el script:
eval $folderItems
Así que ya sabemos: si en algún momento tenemos guardado un comando dentro de una variable y queremos ejecutarlo, no tenemos que buscar mucho más allá de eval
. Por supuesto, tendremos que tener cuidado de poner las comillas donde deben ir para evitar errores.
Espero que este post les haya resultado útil. ¡Nos leemos en breve!
¡Aprovechá la oportunidad de suscribirte al blog para recibir en tu correo el post nuestro de cada día, novedades, y promociones exclusivas!