Eu tenho um fragmento JSON.
O seguinte não funciona:
VALUE=<<PERSON
{
"type": "account",
"customer_id": "1234",
"customer_email": "[email protected]"
}
PERSON
echo -n "$VALUE" | python -m json.tool
O resultado é:
Nenhum objeto JSON pôde ser decodificado
Fazendo o mesmo com jq
, ie
echo -n "$VALUE" | jq '.'
Não há saída.
Existe o mesmo comportamento para o seguinte:
VALUE=<<PERSON
'{
"type": "account",
"customer_id": "1234",
"customer_email": "[email protected]"
}'
PERSON
echo -n "$VALUE" | python -m json.tool
Resposta:
Nenhum objeto JSON pôde ser decodificado
Mas o seguinte funciona:
VALUE='{
"type": "account",
"customer_id": "1234",
"customer_email": "[email protected]"
}'
echo -n "$VALUE" | jq '.'
echo -n "$VALUE" | python -m json.tool
echo $VALUE
sem... | jq
seria informativo.Respostas:
Sem saída.
Um documento aqui é um redirecionamento , você não pode redirecionar para uma variável.
Quando a linha de comando é analisada, os redirecionamentos são tratados em uma etapa separada das atribuições de variáveis. Seu comando é, portanto, equivalente a (observe o espaço)
Ou seja, ele atribui uma string vazia à sua variável e, em seguida, redireciona a entrada padrão da string here para o comando (mas não há comando, então nada acontece).
Observe que
é válido, como é
Só que não há nenhum comando cujo fluxo de entrada padrão possa ser definido para conter os dados, portanto, ele está perdido.
Isso funcionaria:
Aqui, o comando que recebe o documento here é
cat
e o copia para sua saída padrão. É então o que é atribuído à variável por meio da substituição de comando.No seu caso, você poderia usar
sem dar o passo extra de armazenar os dados em uma variável.
fonte
PERSON="
seguir uma nova linha e os dados de várias linhas, depois outra"
no final.PERSON='
. Isso a menos que o OP queira interpolar variáveis mais tarde.Como a variável não está sendo definida pelo seu heredoc:
Se você deseja usar um heredoc para atribuir um valor a uma variável, precisa de algo como:
fonte
<< \PERSON
proteção contra$
s na entrada e barras invertidas no final das linhas.$(cat <<EOF ... EOF)
é uma construção estranha: executar um subshell e, em seguida, enviar um heredoc para o gato apenas para enviá-lo para STDOUT e, em seguida, atribuir o resultado desse subshell a uma variável? Eu gostaria que as pessoas pensassem no que estão dizendo sobre seus processos de pensamento. A atribuição de um heredoc a uma variável por meioread
de comparação é sensata.$(cat << EOF
… (dados)…EOF
)
é estranho. É estranho e complicado, mas também éread -d … << EOF
- especialmenteread -d '' << EOF
. Agradeço a resposta de Terdon, porque ele usa apenas builtins, sem programas. Mas, mais importante, o$(cat << EOF
… (dados)…EOF
)
falha se alguma linha termina com\
(barra invertida) - veja os comentários na resposta de Kusalananda .Isso ocorre porque a maneira como você definiu um documento aqui para usar com um JSON está errada. Você precisa usá-lo como
e fazer
printf "$VALUE"
deve despejar o JSON conforme o esperado.fonte
Heredocs e variáveis não se misturam bem ou pelo menos não dessa maneira. Você também pode…
Passe o heredoc como a entrada padrão de um aplicativo
ou…
Armazenar texto de várias linhas em uma variável de shell
Usei aspas simples para evitar a necessidade de escapar das aspas duplas internas. Claro que você também pode usar aspas duplas, por exemplo, se precisar expandir parâmetros:
Então você pode usar o valor da variável mais tarde.
fonte