如何将空的JSON大括号作为默认值回显?


12

{}如果缺少envvar,我似乎无法得到空的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

如何正确逃脱?


有趣,但是使用bash 4.3 echo "${X:-{\}}"可以正常工作。
Sergiy Kolodyazhnyy

@SergiyKolodyazhnyy在4.2中已修复;我回想起有关参数扩展运算符后面的单词扩展引用以符合POSIX标准的一些讨论。
chepner

Answers:


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

引号这里必须的,这看起来很滑稽,但在语法上是好的。

单引号不起作用,我不确定为什么不这样做。这是真正的嵌套报价,而不是最终报价,您可以通过在其中插入空格来验证。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

略为冗长,但无需过多强调引号即可使用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.