Boş bir JSON kıvırcık parantezlerini varsayılan değer olarak nasıl yankılarım?


12

{}Bir envvar eksikse yankı için boş bir JSON alamıyorum. Ayarlandıysa }çıkışta bir iz var ya da kaçış görüntüleniyor.

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

Nasıl doğru bir şekilde kaçabilirim?


İlginç, ama bash 4.3 ile echo "${X:-{\}}"gayet iyi çalıştı.
Sergiy Kolodyazhnyy

@SergiyKolodyazhnyy Bu, 4.2'de düzeltildi; POSIX standardına uyması için parametre genişletme işleçlerini izleyen sözcük genişletmelerinin alıntılanması hakkında bazı tartışmaları hatırlıyorum.
chepner

Yanıtlar:


14

Parantezinizi alıntılayın:

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

İçten çift tırnak işaretleri burada gereklidir, bu komik görünüyor, ancak sözdizimsel olarak iyi.

Tek tırnak işaretleri işe yaramaz ve neden olmadığından tam olarak emin değilim. Bu, iç içe yerleştirilmiş alıntıdır, boşlukları koyarak doğrulayabileceğiniz bitiş ve özgeçmiş değil. Double olsa da iyi çalışır.


Bu POSIX spec ilgili cümle olduğunu düşünüyorum: "Aşağıdaki parametre genişletme değişikliklerini sınırlayan '}' karakteri, daha önce bu bölümde ve çift tırnak içinde açıklandığı gibi belirlenecektir." Bunu, wordaşağıdaki :-ifadelerin özellikle çift tırnaklı olması gerektiği şeklinde yorumluyorum , bunu "${X:-'{}'}"tam anlamıyla ${X:-'{}takip ediyor '}. Spesifikasyonun neden bu kadar spesifik olduğu benim için net değil.
chepner

("Daha önce tarif edilen" ile atıfta bulunulan cümledir "Eşleşen kapanış ayracı,
küme

9

Bir değişkeni aldatabilir ve boş sonuç olarak ayarlayabilir ve alıntılama sorunlarından kaçınabilirsiniz

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

5

Ne sık sık yapmak için karakterler üzerinden onaltılık değerleri kullanmaktır printf:

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

Biraz ayrıntılı, ancak tırnak üzerinde çok fazla stres olmadan çalışır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.