为啥 autoconf 脚本中的条件在变量前加上“x”?

Posted

技术标签:

【中文标题】为啥 autoconf 脚本中的条件在变量前加上“x”?【英文标题】:Why do conditionals in autoconf scripts prefix variables with "x"?为什么 autoconf 脚本中的条件在变量前加上“x”? 【发布时间】:2012-07-01 05:23:48 【问题描述】:

为什么 autoconf 脚本中的条件语句在其变量前加上“x”?例如,GNU 提供的用于测试 Boost 的宏具有诸如

之类的条件
if test "x$want_boost" = "xyes"; then

为什么不定义为:

if test "$want_boost" = "yes"; then

【问题讨论】:

【参考方案1】:

在一些早期的 shell 中,测试空字符串变量并不像现在那么容易,所以最好的替代方法是查看“x$variable”是否等于“x”。此外,由于这显然使用了test,这比尝试正确引用/转义诸如 '$x != "y"' 之类的序列更简单,而不会失去理智和/或可移植性。

【讨论】:

澄清一下:“不像现在那么容易”意味着许多 shell 存在错误,无法正确评估带有空字符串(如 test "" = "foo")的命令 这是必要的 other 原因是,如果 $variable 扩展为以破折号开头的内容,test 可能会将其解释为选项而不是字符串进行比较。在现代 shell 中,等号优先,但并非总是如此。 @zwol 你的评论应该是答案,请写一个。 @MarcH 嗯,当然,为什么不呢。【参考方案2】:

在符合 POSIX 的 shell 中,

test "$foo" = "$bar"

无论变量foobar 的内容是什么,都会进行字符串比较。但是在旧的、不兼容的 shell 中,如果 foo 包含以破折号开头的内容,test 会尝试将其解释为一元运算符,因此它会抛出语法错误或进行错误的测试。写x"$foo" = x"$bar" 使这成为不可能。如果任一参数扩展为空字符串,我也模糊地回忆起问题,但这可能只有在您省略双引号时才会出现(在这种情况下,现代 shell 也会出现问题)。

这在编写配置脚本时尤其重要,因为至少在原则上,无论 shell 环境有多旧,它们都应该可以工作;如果你今天在 2020 年编写一个新程序,那么你使用 C 和 autoconf 最合理的原因是你需要对一些旧系统的可移植性......

【讨论】:

以上是关于为啥 autoconf 脚本中的条件在变量前加上“x”?的主要内容,如果未能解决你的问题,请参考以下文章

为啥shell脚本比较经常使用x$VAR = xyes?

shell脚本中怎样对特殊字符进行处理 一串密码在加密前对密码中的!@#$%等特殊字符进行处理(加上‘’)。

为啥在 MySQL 中的变量前使用 @? [复制]

为啥 StyleCop 建议在方法或属性调用前加上“this”?

为啥 autoconf 会错误地找到以后不可用的功能?

使用 automake/autoconf 条件生成文件