BASH / SH / .. AutoConf:包装字符串比较

时间:2014-01-16 11:15:03

标签: shell autoconf m4

我正在修改configure.ac以用于AutoConf: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

编写的

3 个答案:

答案 0 :(得分:2)

对于shell可移植性,你真的应该尽可能地在M4sh宏中包装。在autoconf中writing portable shell code有一些特殊注意事项,这就是代码看起来如此神秘的原因。

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

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

This page告诉我为什么在x语句中有test前导。在这种情况下,如果你愿意,你可以在没有它的情况下离开。

答案 1 :(得分:1)

使用expr应该是可移植的(并且可读):

if expr $foo; then
  #do something
fi

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

答案 2 :(得分:1)

使用test需要一些奇怪的结构来处理古代的贝壳。如果你不关心这些贝壳,你可以使用AS_IF和一个简单的测试,但如果你不关心可移植性,你可能不应该为autoconf烦恼。使用AS_CASE,IMO:

可能会稍微清晰一些
 AS_CASE($foo,[1], [...], [...default commands (if $foo != `)])