我在autoconf配置脚本中找到了这段代码,下面的代码试图做什么?

时间:2017-07-18 16:17:24

标签: bash

我在autoconf配置脚本中找到了这段代码。以下代码试图做什么?

if ${am_cv_autoconf_installed+:} false; then :
$as_echo_n "(cached) " >&6
else

1 个答案:

答案 0 :(得分: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"的null命令作为参数,这被简单地忽略,导致if语句计算为true。在第二种情况下,它调用false命令,导致if语句评估为false。

所以这一切都是检查am_cv_autoconf_installed是否已定义。如果这只是一个普通的bash脚本并且不需要任何特定级别的可移植性,那么这样做会简单得多:

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

但是,由于这是一个配置脚本,因此毫无疑问是以这种方式编写的,以实现最大的可移植性。并非所有shell都会进行-n测试。有些人甚至可能没有[ ]语法。

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

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