J'ai un fragment JSON.
Ce qui suit ne fonctionne pas:
VALUE=<<PERSON
{
"type": "account",
"customer_id": "1234",
"customer_email": "[email protected]"
}
PERSON
echo -n "$VALUE" | python -m json.tool
Le résultat est:
Aucun objet JSON n'a pu être décodé
Faire de même avec jq
, c.-à-d.
echo -n "$VALUE" | jq '.'
Il n'y a pas de sortie.
Il existe le même comportement pour les éléments suivants:
VALUE=<<PERSON
'{
"type": "account",
"customer_id": "1234",
"customer_email": "[email protected]"
}'
PERSON
echo -n "$VALUE" | python -m json.tool
Réponse:
Aucun objet JSON n'a pu être décodé
Mais les travaux suivants:
VALUE='{
"type": "account",
"customer_id": "1234",
"customer_email": "[email protected]"
}'
echo -n "$VALUE" | jq '.'
echo -n "$VALUE" | python -m json.tool
echo $VALUE
sans... | jq
serait instructif.Réponses:
Pas de sortie.
Un document ici est une redirection , vous ne pouvez pas rediriger vers une variable.
Lorsque la ligne de commande est analysée, les redirections sont gérées dans une étape distincte des affectations de variables. Votre commande est donc équivalente à (notez l'espace)
Autrement dit, il affecte une chaîne vide à votre variable, puis redirige l'entrée standard de la chaîne here-string vers la commande (mais il n'y a pas de commande, donc rien ne se passe).
Notez que
est valide, tel quel
C'est juste qu'il n'y a pas de commande dont le flux d'entrée standard peut être défini pour contenir les données, il est donc juste perdu.
Cela fonctionnerait cependant:
Ici, la commande qui reçoit le document here est
cat
, et le copie sur sa sortie standard. C'est alors ce qui est affecté à la variable au moyen de la substitution de commande.Dans votre cas, vous pouvez utiliser à la place
sans prendre l'étape supplémentaire de stockage des données dans une variable.
la source
PERSON="
suivi d'un retour à la ligne et des données multilignes, puis d'un autre"
à la fin.PERSON='
. C'est à moins que l'OP ne veuille interpoler des variables plus tard.Parce que la variable n'est pas définie par votre hérédoc:
Si vous souhaitez utiliser un hérédoc pour affecter une valeur à une variable, vous avez besoin de quelque chose comme:
la source
<< \PERSON
de vous protéger contre les$
s dans l'entrée et les barres obliques inverses à la fin des lignes.$(cat <<EOF ... EOF)
est une construction bizarre: exécuter un sous-shell puis envoyer un hérédoc à cat juste pour qu'il l'envoie à STDOUT et ensuite attribuer le résultat de ce sous-shell à une variable? J'aimerais que les gens réfléchissent à ce qu'ils disent de leurs processus de pensée. Affecter un hérédoc à une variable viaread
, par comparaison, est sain.$(cat << EOF
… (données)…EOF
)
est bizarre. C'est maladroit et alambiqué, mais c'est le casread -d … << EOF
- surtoutread -d '' << EOF
. J'apprécie la réponse de terdon car il n'utilise que des programmes intégrés, pas de programmes. Mais, plus important encore, les$(cat << EOF
… (données)…EOF
)
échouent si des lignes se terminent par\
(barre oblique inverse) - voir les commentaires sous la réponse de Kusalananda .C'est parce que la façon dont vous avez défini un document ici à utiliser avec un JSON est incorrecte. Vous devez l'utiliser comme
et faire
printf "$VALUE"
devrait vider le JSON comme prévu.la source
Heredocs et variables ne se mélangent pas bien ou du moins pas de cette façon. Tu peux soit…
Passer l'hérédoc comme entrée standard d'une application
ou…
Stocker du texte sur plusieurs lignes dans une variable shell
J'ai utilisé des guillemets simples pour éviter d'avoir à échapper aux guillemets doubles internes. Bien sûr, vous pouvez également utiliser des guillemets doubles, par exemple si vous devez étendre les paramètres:
Vous pourrez ensuite utiliser la valeur de la variable ultérieurement.
la source