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

Nic*_*k T 13 bash variable

{}如果缺少 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
Run Code Online (Sandbox Code Playgroud)

我如何正确逃脱它?

Mic*_*mer 15

引用你的括号:

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:-"{}"}"
{}
Run Code Online (Sandbox Code Playgroud)

这里需要内部引号,这看起来很有趣但在语法上很好。

单引号不起作用,我不完全确定为什么不这样做。这是真正的嵌套引用,而不是结束和恢复,您可以通过放入空格来验证。但 Double 可以正常工作。


Ste*_*ris 9

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

$ def="{}"
$ echo ${X:-$def}
{}
$ X=y
$ echo ${X:-$def}
y
$ unset X
$ echo ${X:-$def}
{}
$ 
Run Code Online (Sandbox Code Playgroud)


Ser*_*nyy 5

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

bash-4.3$ echo "${X:-$(printf '\x7B\x7D')}"
{}
bash-4.3$ X="something"
bash-4.3$ echo "${X:-$(printf '\x7B\x7D')}"
something
Run Code Online (Sandbox Code Playgroud)

有点冗长,但工作时不会过分强调引号。