如何回显空 JSON 花括号作为默认值?

如何回显空 JSON 花括号作为默认值?

{}如果缺少 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

我如何正确逃脱它?

答案1

引用你的大括号:

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 也可以正常工作。

答案2

您可以作弊并将变量设置为空结果,并避免引用问题

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

答案3

我经常做的是通过以下方式使用字符的十六进制值printf

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

有点冗长,但无需过多强调引号即可。

相关内容