Як я повторюю порожні фігурні дужки 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.
чепнер

Відповіді:


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:-'{}слід '}. Чому специфіка така специфічна, мені незрозуміло.
чепнер

(Речення, на яке посилалося "описано раніше", є "Збірна дужка, що закривається, визначається підрахунком рівнів
дужок

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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.