Tengo una matriz JSON así:
{
"SITE_DATA": {
"URL": "example.com",
"AUTHOR": "John Doe",
"CREATED": "10/22/2017"
}
}
Estoy buscando iterar sobre esta matriz usando jq para poder establecer la clave de cada elemento como el nombre de la variable y el valor como su valor.
Ejemplo:
- URL = "ejemplo.com"
- AUTOR = "John Doe"
- CREADO = "22/10/2017"
Lo que tengo hasta ahora itera sobre la matriz pero crea una cadena:
constants=$(cat ${1} | jq '.SITE_DATA' | jq -r "to_entries|map(\"\(.key)=\(.value|tostring)\")|.[]")
Qué salidas:
URL=example.com
AUTHOR=John Doe
CREATED=10/22/2017
Estoy buscando usar estas variables más abajo en el script:
echo ${URL}
Pero esto tiene una salida vacía en este momento. Supongo que necesito eval
algo o algo allí, pero parece que no puedo señalarlo.
declare -- “$key=$value”
y hacer que$AUTHOR
etc. funcione como en el original, sin una matriz. Todavía es más seguro que eval, aunque cambiarPATH
o algo todavía es posible, por lo que es menos que esta versión.declare --
versión sea segura comparando $ key con una lista de nombres de variables permitidos.Me acabo de dar cuenta de que puedo recorrer los resultados y evaluar cada iteración:
Me permite hacer:
fuente
Realmente me gusta la sugerencia de @Michel. A veces, realmente puede extraer el valor de algunas variables para ejecutar una tarea en ese servidor específico usando BASH. Entonces, las variables deseadas son conocidas. El uso de este enfoque es la forma de evitar o hacer múltiples llamadas a jq para establecer un valor por variable o incluso usar la declaración de lectura con múltiples variables en las que algunas pueden ser válidas y vacías, lo que lleva a un cambio de valor (ese fue mi problema)
mi enfoque anterior de que el plomo conducirá a un error de cambio de valor si .svID [] .ID = "" ( sv obtendrá el valor de slotID
Si descargó el objeto usando curl, aquí está mi enfoque para cambiar el nombre de algunas variables a un nombre descriptivo como extraer datos de matrices de datos
El uso de eval y los filtros resolverá el problema con una línea y producirá variables con el nombre deseado.
La ventaja en este caso es el hecho de que filtrará, cambiará el nombre y formateará todas las variables deseadas en el primer paso. Observe que allí hay. [0] | eso es muy común tener si la fuente es de un servidor API RESTFULL usando GET, datos de respuesta como:
Si sus datos no son de una matriz, es decir. es un objeto como:
simplemente elimine el índice inicial:
Esta es una vieja pregunta, pero sentí compartir, ya que era difícil de encontrar
fuente