Estoy intentando ejecutar este código:
while read Item; do
export environmentVariables="$environmentVariables\n - $Item"
done <<< "$(
cat /LocalSecrets/EnvironmentVariables.json |
jq -r 'to_entries[] | "\(.key)=\(.value)"' |
)"
Tengo un archivo JSON simple en /LocalSecrets/EnvironmentVariables.json
. Es un objeto JSON de par clave/valor simple:
{
"FirstKey": "FirstValue",
"SecondKey": "SecondValue",
"ThirdKey": "ThirdValue"
}
Y quiero leerlo usando jq
y agregarlos todos a una variable de shell $environmentVariables
como:
FirstKey=FirstValue
SecondKey=SecondValue
ThirdKey=ThirdValue
Pero como jq
necesita comillas dobles en su comando y necesito usar heredoc para preservar el $environmentVariables
shell actual en el bucle, estoy atascado. Ese código no se ejecuta y tiene errores sintácticos.
¿Qué tengo que hacer? También estoy abierto a otras soluciones.
Respuesta1
En realidad, ha colocado correctamente comillas dobles dentro de su documento heredoc. Pero lo último |
no es necesario, produce un error de sintaxis.
La primera asignación de parámetros le proporciona una nueva línea adicional, pero la siguiente debería funcionar. Usando heredoc:
while read item; do
export environmentVariables="$environmentVariables\n$item"
done <<< "$(
cat /LocalSecrets/EnvironmentVariables.json |
jq -r 'to_entries[] | [.key, .value] | join("=")'
)"
Lo mismo, pero usando sustitución de procesos:
while read item; do
export environmentVariables="$environmentVariables\n$item"
done < <(cat /LocalSecrets/EnvironmentVariables.json |
jq -r 'to_entries[] | [.key, .value] | join("=")')
<(commands)
essustitución de procesos, el resultado de la ejecución de los comandos aparece como un nombre de archivo especial y se pasa while
con una simple redirección de entrada <
.
Alternativamente, puede usar una tubería simple pero indicarle al shell que ejecute su último elemento ( while
) en el entorno actual del shell, lo que le permitirá conservar el valor de su variable:
shopt -s lastpipe
cat /LocalSecrets/EnvironmentVariables.json |
jq -r 'to_entries[] | [.key, .value] | join("=")' |
while read item
do
export environmentVariables="$environmentVariables\n$item"
done
Además, si realmente necesita caracteres de nueva línea en su variable, y no literalmente \n
caracteres, simplemente haga lo siguiente:
export environmentVariables=$(
cat /LocalSecrets/EnvironmentVariables.json |
jq -r 'to_entries[] | [.key, .value] | join("=")'
)