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 jq
e anexar todos eles a uma variável shell $environmentVariables
como:
FirstKey=FirstValue
SecondKey=SecondValue
ThirdKey=ThirdValue
Mas como jq
precisa de aspas duplas em seu comando e preciso usar o heredoc para preservar o $environmentVariables
shell 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 while
com 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 \n
de caracteres, basta fazer:
export environmentVariables=$(
cat /LocalSecrets/EnvironmentVariables.json |
jq -r 'to_entries[] | [.key, .value] | join("=")'
)