Ich habe ein JSON-Fragment.
Folgendes funktioniert nicht:
VALUE=<<PERSON
{
"type": "account",
"customer_id": "1234",
"customer_email": "[email protected]"
}
PERSON
echo -n "$VALUE" | python -m json.tool
Das Ergebnis ist:
Es konnte kein JSON-Objekt dekodiert werden
Das Gleiche tun mit jq
, dh
echo -n "$VALUE" | jq '.'
Es erfolgt keine Ausgabe.
Es gibt das gleiche Verhalten für Folgendes:
VALUE=<<PERSON
'{
"type": "account",
"customer_id": "1234",
"customer_email": "[email protected]"
}'
PERSON
echo -n "$VALUE" | python -m json.tool
Antwort:
Es konnte kein JSON-Objekt dekodiert werden
Aber folgendes funktioniert:
VALUE='{
"type": "account",
"customer_id": "1234",
"customer_email": "[email protected]"
}'
echo -n "$VALUE" | jq '.'
echo -n "$VALUE" | python -m json.tool
echo $VALUE
Ohne... | jq
wäre informativ.Antworten:
Keine Leistung.
Ein Here-Dokument ist eine Umleitung , Sie können nicht in eine Variable umleiten.
Wenn die Befehlszeile analysiert wird, werden Umleitungen in einem von den Variablenzuweisungen getrennten Schritt behandelt. Ihr Befehl entspricht daher (beachten Sie das Leerzeichen)
Das heißt, es weist Ihrer Variablen eine leere Zeichenfolge zu und leitet dann die Standardeingabe von der Here-Zeichenfolge in den Befehl um (es gibt jedoch keinen Befehl, sodass nichts passiert).
Beachten Sie, dass
ist gültig, wie es ist
Es gibt nur keinen Befehl, dessen Standardeingabestream so eingestellt werden kann, dass er die Daten enthält. Er geht also einfach verloren.
Dies würde jedoch funktionieren:
Hier ist der Befehl, der das Here-Dokument empfängt
cat
, und es kopiert es in seine Standardausgabe. Dies wird dann der Variablen durch die Befehlssubstitution zugewiesen.In Ihrem Fall könnten Sie stattdessen verwenden
ohne den zusätzlichen Schritt des Speicherns der Daten in einer Variablen zu unternehmen.
quelle
PERSON="
eine neue Zeile und die mehrzeiligen Daten gefolgt von einer weiteren"
am Ende verwenden.PERSON='
. Es sei denn, das OP möchte später Variablen interpolieren.Weil die Variable nicht von Ihrem Heredoc festgelegt wird:
Wenn Sie einen Heredoc verwenden möchten, um einer Variablen einen Wert zuzuweisen, benötigen Sie Folgendes:
quelle
<< \PERSON
, sich vor$
s in der Eingabe und Backslashes an den Zeilenenden zu schützen .$(cat <<EOF ... EOF)
ist ein seltsames Konstrukt: eine Unterschale ausführen und dann einen Heredoc an cat senden, nur damit er an STDOUT gesendet wird, und dann das Ergebnis dieser Unterschale einer Variablen zuweisen? Ich wünschte, die Leute würden darüber nachdenken, was sie über ihre Denkprozesse sagen . Imread
Vergleich dazu ist es sinnvoll, einer Variablen über einen Heredoc zuzuweisen.$(cat << EOF
… (Daten)…EOF
)
komisch ist. Es ist umständlich und verworren, aber auchread -d … << EOF
- besondersread -d '' << EOF
. Ich schätze Terdons Antwort, weil sie nur eingebaute Programme verwendet. Noch wichtiger ist jedoch, dass$(cat << EOF
… (Daten)…EOF
)
fehlschlägt, wenn Zeilen mit\
(Backslash) enden - siehe die Kommentare unter Kusalanandas Antwort .Dies liegt daran, dass die Art und Weise, wie Sie ein Here-Dokument für die Verwendung mit einem JSON definiert haben, falsch ist. Sie müssen es als verwenden
und dabei
printf "$VALUE"
sollte der JSON wie erwartet ausgegeben werden.quelle
Heredocs und Variablen mischen sich nicht gut oder zumindest nicht auf diese Weise. Du kannst entweder…
Übergeben Sie den Heredoc als Standardeingabe einer Anwendung
oder…
Speichern Sie mehrzeiligen Text in einer Shell-Variablen
Ich habe einfache Anführungszeichen verwendet, um zu vermeiden, dass die inneren doppelten Anführungszeichen vermieden werden müssen. Natürlich können Sie auch doppelte Anführungszeichen verwenden, z. B. wenn Sie Parameter erweitern müssen:
Dann können Sie den Variablenwert später verwenden.
quelle