1

我正在修改用于 AutoConf 的configure.ac:http://mathpad.wikidot.com/acousto-configure-ac

该脚本指出它需要在 darwin、solaris、cygwin 和 linux 上运行。

我认为这就是它使用比较字符串的神秘方法的原因:

foo="1"
if test "x$foo" != "x0"; then

这种双重否定使代码难以阅读。我可以清理它吗?

我如何实现字符串比较宏:

if STR_EQUAL( $foo, "1" ); then

或者:

if TRUE( $foo ); then

这是解决问题的最佳方法吗?

编辑:显然这个脚本是用 M4 http://www.gnu.org/software/m4/manual/m4.html编写的

4

3 回答 3

2

对于 shell 的可移植性,你真的应该尽可能多地包装在M4sh宏中。在 autoconf 中编写可移植的 shell 代码有一些特殊的考虑,这就是代码看起来如此神秘的原因。

话虽如此,清理令人困惑的代码没有任何限制:

foo="1"
AS_IF([test "x$foo" = "x1"], [...])

此页面x说明了为什么此test声明中有前导。在这种情况下,如果你愿意,你可以不使用它。

于 2014-01-16T19:50:29.113 回答
1

使用expr应该足够便携(和可读):

if expr $foo; then
  #do something
fi

如果要消除 的输出expr,请说:if expr $foo >/dev/null; then

于 2014-01-16T12:17:51.753 回答
1

使用test需要一些奇怪的结构来处理古代贝壳。如果你不关心这些 shell,你可以使用AS_IF一个简单的测试,但如果你不关心可移植性,你可能不应该打扰 autoconf。使用起来可能稍微干净一些AS_CASE,IMO:

 AS_CASE($foo,[1], [...], [...default commands (if $foo != `)])
于 2014-01-17T00:30:27.023 回答