Làm cách nào để lặp lại dấu ngoặc nhọn JSON rỗng làm giá trị mặc định?


11

Tôi dường như không thể nhận được một JSON trống {}để lặp lại nếu thiếu một envvar. Tôi có một dấu }ở đầu ra nếu được đặt hoặc thoát hiển thị.

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

Làm thế nào để tôi thoát khỏi nó một cách chính xác?


Thú vị, nhưng với bash 4.3 echo "${X:-{\}}"chỉ hoạt động tốt.
Sergiy Kolodyazhnyy

@SergiyKolodyazhnyy Điều đó đã được sửa trong 4.2; Tôi nhớ lại một số cuộc thảo luận về việc trích dẫn mở rộng từ sau các toán tử mở rộng tham số để phù hợp với tiêu chuẩn POSIX.
chepner

Câu trả lời:


14

Trích dẫn niềng răng của bạ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:-"{}"}"
{}

Nội đôi dấu ngoặc kép được yêu cầu ở đây, mà có vẻ buồn cười nhưng là cú pháp tốt.

Dấu ngoặc đơn sẽ không hoạt động, và tôi không hoàn toàn chắc chắn tại sao không. Đây là trích dẫn lồng nhau thực sự, không phải là kết thúc và tiếp tục, mà bạn có thể xác minh bằng cách đặt dấu cách vào. Double sẽ hoạt động tốt mặc dù.


Tôi nghĩ rằng đây là câu có liên quan từ thông số POSIX: "Ký tự '}' phân định các sửa đổi mở rộng tham số sau sẽ được xác định như được mô tả trước đây trong phần này và trong Dấu ngoặc kép." Tôi giải thích điều này có nghĩa là wordsau đây :-phải được trích dẫn cụ thể, do đó theo "${X:-'{}'}"nghĩa đen là ${X:-'{}theo sau '}. Tại sao thông số kỹ thuật rất cụ thể là không rõ ràng với tôi.
chepner

(Câu được đề cập bởi "được mô tả trước đây" là "Nẹp đóng phù hợp sẽ được xác định bằng cách đếm các mức nẹp, bỏ qua các chuỗi được trích dẫn kèm theo và thay thế lệnh.")
chepner

9

Bạn có thể gian lận và đặt một biến là kết quả trống và tránh các vấn đề trích dẫn

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

5

Những gì tôi thường làm là sử dụng các giá trị hex cho các ký tự thông qua printf:

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

Hơi dài dòng, nhưng hoạt động mà không quá căng thẳng về dấu ngoặc kép.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.