ฉันจะสะท้อนวงเล็บปีกกาว่าง JSON เป็นค่าเริ่มต้นได้อย่างไร


12

ฉันดูเหมือนจะไม่ได้รับ JSON ว่างเปล่า{}เพื่อสะท้อนถ้า envvar หายไป ฉันอาจมีส่วนท้าย}ในเอาต์พุตหากตั้งค่าไว้หรือ 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

ฉันจะหนีมันอย่างถูกต้องได้อย่างไร


น่าสนใจ แต่ด้วย bash 4.3 echo "${X:-{\}}"ก็ใช้งานได้ดี
Sergiy Kolodyazhnyy

@SergiyKolodyazhnyy นั่นได้รับการแก้ไขใน 4.2; ฉันจำการสนทนาบางอย่างเกี่ยวกับการอ้างอิงการขยายคำตามผู้ดำเนินการขยายพารามิเตอร์เพื่อให้สอดคล้องกับมาตรฐาน POSIX
chepner

คำตอบ:


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

ต้องใช้เครื่องหมายคำพูดคู่ด้านในที่นี่ซึ่งดูตลก แต่ก็ใช้ได้ดี

คำพูดเดี่ยวไม่ทำงานและฉันไม่แน่ใจว่าทำไม นี่เป็นข้อความที่ซ้อนกันจริงไม่ใช่แบบ end-and-resume ซึ่งคุณสามารถตรวจสอบได้โดยใส่ช่องว่าง Double จะทำงานได้ดี


ฉันคิดว่านี่เป็นประโยคที่เกี่ยวข้องจากข้อมูลจำเพาะ POSIX: "ตัวอักษร '}' ที่คั่นการแก้ไขการขยายพารามิเตอร์ต่อไปนี้จะได้รับการพิจารณาตามที่อธิบายไว้ก่อนหน้านี้ในส่วนนี้และในเครื่องหมายคำพูดคู่" ผมเข้าใจว่านี่เป็นความหมายwordต่อไปนี้:-จะต้องได้รับโดยเฉพาะยกมาสองครั้งเพื่อให้"${X:-'{}'}"เป็นอักษรตามด้วย${X:-'{} '}ทำไมสเป็คเฉพาะเจาะจงจึงไม่ชัดเจนสำหรับฉัน
chepner

(ประโยคที่อ้างถึงโดย "อธิบายไว้ก่อนหน้านี้" คือ "รั้งปิดการจับคู่จะถูกกำหนดโดยการนับระดับวงเล็บปีกกาข้ามสายที่ยกมาล้อมรอบและการแทนคำสั่ง.")
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

verbose เล็กน้อย แต่ทำงานได้โดยไม่ต้องเครียดมากเกินไปเกี่ยวกับคำพูด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.