我正在修改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
编写的答案 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 != `)])