मैं एक खाली JSON घुंघराले कोष्ठक को डिफ़ॉल्ट मान के रूप में कैसे प्रतिध्वनित करूं?


12

{}अगर कोई एन्वार याद आ रहा है तो मैं एक खाली JSON प्राप्त नहीं कर सकता । }यदि सेट में मैं या तो आउटपुट में एक अनुगामी है, या एस्केप प्रदर्शित करता है।

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

मैं इसे सही तरीके से कैसे बचा सकता हूं?


दिलचस्प है, लेकिन मार के साथ 4.3 echo "${X:-{\}}"बस ठीक काम किया।
सर्गी कोलोडियाज़नी

@SergiyKolodyazhnyy जो कि 4.2 में तय किया गया था; POSIX मानक के अनुरूप पैरामीटर विस्तार ऑपरेटरों के बाद शब्द विस्तार के उद्धरण के बारे में मुझे कुछ चर्चा याद है।
15

जवाबों:


14

अपने ब्रेसिज़ को कोट करें:

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

यहां आंतरिक दोहरे उद्धरण चिह्नों की आवश्यकता होती है, जो मज़ेदार लगता है, लेकिन वाक्यविन्यास रूप से ठीक है।

एकल उद्धरण काम नहीं करेगा, और मुझे पूरी तरह से यकीन नहीं है कि क्यों नहीं। यह वास्तविक नेस्टेड उद्धरण है, अंत-और फिर से शुरू नहीं, जिसे आप रिक्त स्थान डालकर सत्यापित कर सकते हैं। डबल ठीक काम करेगा।


मुझे लगता है कि यह POSIX कल्पना से प्रासंगिक वाक्य है: "'}' वर्ण जो निम्नलिखित पैरामीटर विस्तार संशोधनों को चित्रित करता है, जैसा कि इस खंड में और डबल-कोट्स में पहले वर्णित किया गया है।" मैं इसका अर्थ यह बताता हूं कि wordनिम्नलिखित :-को विशेष रूप से दो-तरफा होना चाहिए, इसलिए "${X:-'{}'}"इसका शाब्दिक अर्थ ${X:-'{}है '}। विशिष्ट क्यों विशिष्ट है यह मेरे लिए स्पष्ट नहीं है।
शेपनर

("पहले वर्णित" द्वारा निर्दिष्ट वाक्य है "मिलान ब्रेस ब्रेस ब्रेस स्तर की गणना द्वारा निर्धारित किया जाएगा, संलग्न उद्धृत तार पर लंघन, और कमांड प्रतिस्थापन।")
15:22 पर chepner

9

आप खाली परिणाम के लिए एक चर को धोखा और सेट कर सकते हैं, और उद्धृत मुद्दों से बच सकते हैं

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

5

मैं अक्सर किसके माध्यम से वर्णों के लिए हेक्स मान का उपयोग करता हूं printf:

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

थोड़ा क्रिया, लेकिन उद्धरण के बारे में बहुत अधिक तनाव के बिना काम करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.