Bash 如何在执行字符串插值时转义结束括号

Bash 如何在执行字符串插值时转义结束括号,bash,Bash,我想回显变量的值或默认值(如果变量为空或未设置) 我试过: echo "${X:-{}}" 结果: 值} 如果X的值已设置或 {} 如果没有设置 设置变量后,输出中会出现一个右括号,这是一种不希望出现的行为。我怎样才能避开结束括号?(我尝试用“\”转义,但没有成功…这样做可以: echo "${X:-"{}"}" 解析器认为第一个}正在关闭${},因此打印变量,然后打印第二个}。您需要退出第一个结束括号: echo "${z:-{\}}" 其他答案适用于bash(至少适用于正确版本)、zs

我想
回显变量的值或默认值(如果变量为空或未设置)

我试过:

echo "${X:-{}}"
结果:

值}

如果X的值已设置或

{}

如果没有设置

设置变量后,输出中会出现一个右括号,这是一种不希望出现的行为。我怎样才能避开结束括号?(我尝试用“\”转义,但没有成功…

这样做可以:

echo "${X:-"{}"}"

解析器认为第一个
}
正在关闭
${}
,因此打印变量,然后打印第二个
}
。您需要退出第一个结束括号:

echo "${z:-{\}}"

其他答案适用于
bash
(至少适用于正确版本)、
zsh
ksh
,但至少在
sh
的某些版本中不起作用

使用变量进行替换应该适用于任何地方,我希望:

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

为替换文本使用变量以避免混淆解析器<代码>定义={};echo“${X:-$def}”
我想知道是否有一种更优雅的方法……我现在看不出来。解析器变得“混乱”并提前结束。转义可能是一种选择,但我认为,
\}
不支持转义,因为这里需要转义。如果你能处理一个默认值
{}
,你可以使用
echo“${X:-'{}}”
@Etan使用一个变量作为替换文本似乎对我最有效,谢谢。这导致在bash 3上对未设置的变量使用
{\}
,但对bash 4似乎有效。返回
{\}
GNU bash,4.1.2版
适用于我的bash
4.3.33(1)-发行版
,在ideone.com上适用于
4.3.30(1)-发行版
。bash
4.1.2(1)-但在CentOS 6上发布时失败。同样适用于CentOS 7上的bash
4.2.45(1)-release
。我必须添加一个额外的“.在设置了X的情况下仍然不起作用…@Heschoon你确定你在Bash中吗?该行为(需要更多输入)显示在sh中。如果是Bash,那么是哪个版本?好的,我在Boot2Docker中执行命令,它不使用Bash,这是我问题的根源。