我正在修改一个 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 编写
对于 shell 的可移植性,您确实应该尽可能多地包装在 M4sh 宏中。 在 autoconf 中编写可移植的 shell 代码有一些特殊的注意事项,这就是为什么代码看起来如此晦涩难懂的原因。
话虽如此,清理令人困惑的代码没有任何限制:
foo="1"
AS_IF([test "x$foo" = "x1"], [...])
本页说明了为什么此test
语句中有领先x
。 在这种情况下,如果你愿意,你可以在没有它的情况下逃脱。
使用expr
应该足够可移植(和可读):
if expr $foo; then
#do something
fi
如果要消除expr
的输出,请说:if expr $foo >/dev/null; then
使用test
需要一些奇怪的结构来处理古代贝壳。 如果你不关心这些shell,你可以使用AS_IF
和一个简单的测试,但如果你不关心可移植性,你可能不应该为autoconf而烦恼。 使用AS_CASE
可能稍微干净一些,IMO:
AS_CASE($foo,[1], [...], [...default commands (if $foo != `)])