Preso em fazer aspas duplas funcionarem dentro do heredoc

Preso em fazer aspas duplas funcionarem dentro do heredoc

Estou tentando executar este código:

    while read Item; do
        export environmentVariables="$environmentVariables\n      - $Item"
    done <<< "$(
        cat /LocalSecrets/EnvironmentVariables.json |
        jq -r 'to_entries[] | "\(.key)=\(.value)"' |
    )"

Eu tenho um arquivo JSON simples em /LocalSecrets/EnvironmentVariables.json. É um objeto JSON simples de par chave/valor:

{
    "FirstKey": "FirstValue",
    "SecondKey": "SecondValue",
    "ThirdKey": "ThirdValue"
}

E eu quero lê-lo usando jqe anexar todos eles a uma variável shell $environmentVariablescomo:

FirstKey=FirstValue
SecondKey=SecondValue
ThirdKey=ThirdValue

Mas como jqprecisa de aspas duplas em seu comando e preciso usar o heredoc para preservar o $environmentVariablesshell atual no loop, estou preso. Esse código não funciona e contém erros sintáticos.

O que devo fazer? Estou aberto a outras soluções também.

Responder1

Na verdade, você colocou corretamente aspas duplas dentro do seu heredoc. Mas o último |não é necessário, pois gera erro de sintaxe.

A primeira atribuição de parâmetro fornece uma nova linha extra, mas a seguinte deve funcionar. Usando heredoc:

while read item; do
    export environmentVariables="$environmentVariables\n$item"
done <<< "$(
    cat /LocalSecrets/EnvironmentVariables.json |
    jq -r 'to_entries[] | [.key, .value] | join("=")'
)"

O mesmo, mas usando substituição de processo:

while read item; do
    export environmentVariables="$environmentVariables\n$item"
done < <(cat /LocalSecrets/EnvironmentVariables.json |
jq -r 'to_entries[] | [.key, .value] | join("=")')

<(commands)ésubstituição de processo, o resultado da execução dos comandos aparece como um nome de arquivo especial e é passado whilecom um simples redirecionamento de entrada <.

Alternativamente, você pode usar um pipe simples, mas instruir o shell a executar seu último elemento ( while) no ambiente shell atual, permitindo preservar o valor da sua variável:

shopt -s lastpipe
cat /LocalSecrets/EnvironmentVariables.json |
jq -r 'to_entries[] | [.key, .value] | join("=")' |
while read item
do
    export environmentVariables="$environmentVariables\n$item"
done

Além disso, se você realmente precisar de caracteres de nova linha em sua variável, e não literalmente \nde caracteres, basta fazer:

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

informação relacionada