Bagaimana cara gema kurung kurawal JSON kosong sebagai nilai default?

11

Sepertinya saya tidak bisa mendapatkan JSON kosong {}untuk bergema jika envvar hilang. Saya juga memiliki mengekor }dalam output jika diatur, atau menampilkan pelarian.

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

Bagaimana cara saya menghindarinya dengan benar?

Nick T
sumber
Menarik, tetapi dengan bash 4.3 echo "${X:-{\}}"bekerja dengan baik.
Sergiy Kolodyazhnyy
@SergiyKolodyazhnyy Itu diperbaiki di 4.2; Saya ingat beberapa diskusi tentang mengutip ekspansi kata berikut operator ekspansi parameter agar sesuai dengan standar POSIX.
chepner

Jawaban:

14

Kutip kawat gigi Anda:

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

Dalam dua kutipan yang diperlukan di sini, yang terlihat lucu tapi sintaksis baik-baik saja.

Kutipan tunggal tidak akan berfungsi, dan saya tidak sepenuhnya yakin mengapa tidak. Ini adalah kutipan bersarang nyata, bukan end-and-resume, yang dapat Anda verifikasi dengan memasukkan spasi. Double akan berfungsi dengan baik.

Michael Homer
sumber
Saya pikir ini adalah kalimat yang relevan dari spec POSIX: "Karakter '}' yang membatasi modifikasi ekspansi parameter berikut harus ditentukan seperti yang dijelaskan sebelumnya di bagian ini dan dalam Kutipan Ganda." Saya menafsirkan ini sebagai makna yang wordberikut ini :-harus secara khusus dikutip ganda, sehingga "${X:-'{}'}"secara harfiah ${X:-'{}diikuti oleh '}. Mengapa spek ini sangat spesifik tidak jelas bagi saya.
chepner
(Kalimat yang dirujuk oleh "dijelaskan sebelumnya" adalah "Penjepit penutup yang cocok harus ditentukan dengan menghitung level penjepit, melompati string kutipan terlampir, dan memerintahkan penggantian.")
chepner
9

Anda dapat menipu dan mengatur variabel menjadi hasil kosong, dan menghindari masalah mengutip

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

Yang sering saya lakukan adalah memanfaatkan nilai hex untuk karakter melalui printf:

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

Sedikit bertele-tele, tetapi bekerja tanpa terlalu banyak menekankan tentang kutipan.

Sergiy Kolodyazhnyy
sumber