Come faccio ad echo tra parentesi graffe JSON vuote come valore predefinito?


11

Non riesco a ottenere un JSON vuoto {}da echeggiare se manca un envvar. O ho un trailing }nell'output se impostato, oppure i display di escape.

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

Come posso evitarlo correttamente?


Interessante, ma con bash 4.3 ha echo "${X:-{\}}"funzionato bene.
Sergiy Kolodyazhnyy,

@SergiyKolodyazhnyy Risolto il problema con il 4.2; Ricordo alcune discussioni sulla citazione di espansioni di parole che seguono gli operatori di espansione dei parametri per conformarsi allo standard POSIX.
Chepner,

Risposte:


14

Cita le tue parentesi graffe:

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:-"{}"}"
{}

Qui sono richieste doppie virgolette interne , che sembrano divertenti ma sintatticamente bene.

Le virgolette singole non funzionano e non sono del tutto sicuro del perché. Questa è una vera citazione nidificata, non end-and-resume, che puoi verificare inserendo degli spazi. Il doppio funzionerà bene però.


Penso che questa sia la frase pertinente dalle specifiche POSIX: "Il carattere '}' che delimita le seguenti modifiche all'espansione dei parametri deve essere determinato come descritto in precedenza in questa sezione e nelle virgolette doppie". Interpreto questo nel senso che ciò che wordsegue :-deve essere specificamente tra virgolette doppie, quindi "${X:-'{}'}"è letteralmente ${X:-'{}seguito da '}. Perché le specifiche siano così specifiche non mi è chiaro.
Chepner,

(La frase a cui fa riferimento "descritto precedentemente" è "La parentesi di chiusura corrispondente deve essere determinata contando i livelli di parentesi graffe, saltando le stringhe racchiuse tra virgolette e sostituendo i comandi.")
chepner

9

È possibile imbrogliare e impostare una variabile come risultato vuoto ed evitare problemi di quotazione

$ def="{}"
$ echo ${X:-$def}
{}
$ X=y
$ echo ${X:-$def}
y
$ unset X
$ echo ${X:-$def}
{}
$ 

5

Quello che faccio spesso è utilizzare valori esadecimali per i personaggi tramite printf:

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

Leggermente prolisso, ma funziona senza stressarsi troppo tra virgolette.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.