Wie kann ich leere JSON-Klammern als Standardwert wiedergeben?

11

Ich kann anscheinend keinen leeren JSON {}zum Echo bringen, wenn eine Envvar fehlt. Ich habe entweder ein Trailing }in der Ausgabe, wenn gesetzt, oder das Escape wird angezeigt.

bash-3.2$ unset X
bash-3.2$ echo "${X:-{}}"
{}
bash-3.2$ X=y
bash-3.2$ echo "${X:-{}}"
y}
bash-3.2$ echo "${X:-{\}}"
y
bash-3.2$ unset X
bash-3.2$ echo "${X:-{\}}"
{\}
bash-3.2$ echo "${X:-'{}'}"
'{}'
bash-3.2$ X=z
bash-3.2$ echo "${X:-'{}'}"
z

Wie entkomme ich es richtig?

Nick T.
quelle
Interessant, aber mit Bash 4.3 hat es gut echo "${X:-{\}}"funktioniert.
Sergiy Kolodyazhnyy
@SergiyKolodyazhnyy Das wurde in 4.2 behoben; Ich erinnere mich an eine Diskussion über das Zitieren von Worterweiterungen nach Parametererweiterungsoperatoren, um dem POSIX-Standard zu entsprechen.
Chepper

Antworten:

14

Zitieren Sie Ihre Zahnspange:

bash-3.2$ echo "${X:-"{}"}"
{}
bash-3.2$ X=y
bash-3.2$ echo "${X:-"{}"}"
y
bash-3.2$ unset X
bash-3.2$ echo "${X:-"{}"}"
{}

Hier sind innere doppelte Anführungszeichen erforderlich, was lustig aussieht, aber syntaktisch in Ordnung ist.

Einfache Anführungszeichen funktionieren nicht und ich bin mir nicht ganz sicher, warum nicht. Dies ist ein echtes verschachteltes Zitat, kein Ende und kein Lebenslauf, das Sie überprüfen können, indem Sie Leerzeichen einfügen. Double funktioniert jedoch einwandfrei.

Michael Homer
quelle
Ich denke, dies ist der relevante Satz aus der POSIX-Spezifikation: "Das Zeichen '}', das die folgenden Änderungen der Parametererweiterung begrenzt, wird wie zuvor in diesem Abschnitt und in doppelten Anführungszeichen beschrieben bestimmt." Ich interpretiere dies so, dass das wordFolgende :-speziell in doppelte Anführungszeichen gesetzt werden muss, also "${X:-'{}'}"wörtlich ${X:-'{}gefolgt von '}. Warum die Spezifikation so spezifisch ist, ist mir unklar.
Chepper
(Der Satz, auf den sich "zuvor beschrieben" bezieht, lautet "Die passende schließende Klammer wird durch Zählen der Klammerstufen, Überspringen der eingeschlossenen Zeichenfolgen in Anführungszeichen und Ersetzen von
Befehlen bestimmt
9

Sie können betrügen und eine Variable als leeres Ergebnis festlegen und die Anführungszeichenprobleme vermeiden

$ def="{}"
$ echo ${X:-$def}
{}
$ X=y
$ echo ${X:-$def}
y
$ unset X
$ echo ${X:-$def}
{}
$ 
Stephen Harris
quelle
5

Was ich häufig mache, ist die Verwendung von Hex-Werten für Zeichen über printf:

bash-4.3$ echo "${X:-$(printf '\x7B\x7D')}"
{}
bash-4.3$ X="something"
bash-4.3$ echo "${X:-$(printf '\x7B\x7D')}"
something

Etwas ausführlich, funktioniert aber ohne zu viel Stress bei Anführungszeichen.

Sergiy Kolodyazhnyy
quelle