为啥 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"
无论变量foo
和bar
的内容是什么,都会进行字符串比较。但是在旧的、不兼容的 shell 中,如果 foo
包含以破折号开头的内容,test
会尝试将其解释为一元运算符,因此它会抛出语法错误或进行错误的测试。写x"$foo" = x"$bar"
使这成为不可能。如果任一参数扩展为空字符串,我也模糊地回忆起问题,但这可能只有在您省略双引号时才会出现(在这种情况下,现代 shell 也会出现问题)。
这在编写配置脚本时尤其重要,因为至少在原则上,无论 shell 环境有多旧,它们都应该可以工作;如果你今天在 2020 年编写一个新程序,那么你使用 C 和 autoconf 最合理的原因是你需要对一些旧系统的可移植性......
【讨论】:
以上是关于为啥 autoconf 脚本中的条件在变量前加上“x”?的主要内容,如果未能解决你的问题,请参考以下文章
shell脚本中怎样对特殊字符进行处理 一串密码在加密前对密码中的!@#$%等特殊字符进行处理(加上‘’)。