Atascado al hacer que las comillas dobles funcionen dentro de heredoc

Atascado al hacer que las comillas dobles funcionen dentro de heredoc

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 jqy agregarlos todos a una variable de shell $environmentVariablescomo:

FirstKey=FirstValue
SecondKey=SecondValue
ThirdKey=ThirdValue

Pero como jqnecesita comillas dobles en su comando y necesito usar heredoc para preservar el $environmentVariablesshell 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 whilecon 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 \ncaracteres, simplemente haga lo siguiente:

export environmentVariables=$(
    cat /LocalSecrets/EnvironmentVariables.json |
    jq -r 'to_entries[] | [.key, .value] | join("=")'
)

información relacionada