{}
如果缺少 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
有点冗长,但无需过多强调引号即可。