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?


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.


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}
{}
$ 

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.