2017-07-18 34 views

回答

1

很多东西在这里。让我们分解它。

首先,语法${var+foo}是检查变量var是否已被定义的常用术语。如果定义了var,则${var+foo}将扩展为字符串foo。否则,它将展开为空字符串。

最常见的(在bash,反正),此语法的用法如下:

if [ -n "${var+foo}" ]; then 
    echo "var is defined" 
else 
    echo "var is not defined" 
fi 

注意foo只是任意文本。您也可以使用xabcilovetacos

但是,在你的例子中,没有括号。所以无论${am_cv_autoconf_installed+:}扩展到(如果有的话)将被评估为一个命令。事实证明,:实际上是一个shell命令。即,它是“空命令”。除了将命令退出状态设置为0(成功)之外,它没有任何作用。同样,false是一个不执行任何操作的shell命令,但将退出状态设置为1(失败)。

所以取决于可变am_cv_autoconf_installed是否被定义,该脚本将然后执行以下命令中的一个:

: false 

-OR-

false 

在第一种情况下,它调用空命令,字符串为"false"作为参数,该参数仅被忽略,导致if语句计算结果为true。在第二种情况下,它调用false命令,导致if语句评估为false。

因此,所有这些确实在检查是否定义了am_cv_autoconf_installed。如果这只是一个普通的bash脚本,并没有要求便携性的任何特定的水平,那将是一个简单了很多,只是做的事:

if [ -n "${am_cv_autoconf_installed+x}" ]; then 

然而,由于这是一个配置脚本,这是毫无疑问的用这种方式编写,以实现最大的便携不是所有的炮弹都会有-n测试。有些甚至可能没有[ ]语法。

其余的应该是不言自明的。如果定义了变量,则if语句的计算结果为真(或更准确地说,它将退出状态设置为0),从而导致$as_echo_n "(cached) " >&6行执行。否则,它会执行else子句中的任何操作。

我在猜测$as_echo_n只是echo -n的环境特定版本,这意味着它将打印“(缓存)”,没有结尾的换行符。>&6表示输出将被重定向到文件描述符6,这大概是在脚本的其他地方设置的(可能是日志文件或其他)。