Linux 生成文件中的While循环

Linux 生成文件中的While循环,linux,makefile,Linux,Makefile,我有以下文件: n ?= 10 all: while [[ $${n} -gt 0 ]] ; do \ echo $$n ; \ ((n = n - 1)) ; \ done 当我试图运行它(make)时,运行失败,出现错误: make: *** [all] Error 1 我不明白这次失败的原因。 感谢您的帮助。规则检查最后的返回代码。如果它不为零,make将引发错误。 在您的例子中,最后一个retrun代码是n=2(即1)的((n=n-1)

我有以下文件:

n ?= 10
all:
    while [[ $${n} -gt 0 ]] ; do \
        echo $$n ; \
        ((n = n - 1)) ; \
    done
当我试图运行它(
make
)时,运行失败,出现错误:

make: *** [all] Error 1
我不明白这次失败的原因。

感谢您的帮助。

规则检查最后的返回代码。如果它不为零,
make
将引发错误。 在您的例子中,最后一个retrun代码是n=2(即1)的
((n=n-1))
结果

为了避免错误,只需将第5行修改为:

  ((n = n - 1)) || true; \

请注意:您正在导致makefile非常不可移植。Make始终使用
/bin/sh
调用配方。您编写的菜谱实际上是一个bash脚本,不能与POSIX/bin/sh一起使用;它只在使用/bin/bash作为/bin/sh的系统上工作。许多(大多数,取决于您如何计算它们)不工作

您可以重写:

n ?= 10
all:
        n=$(n); \
        while [ $${n} -gt 0 ] ; do \
            echo $$n ; \
            n=`expr $$n - 1`; \
        done; \
        true

如果将SHELL=/bin/bash添加到Makefile的顶部,那么将使用bash:当然。但为什么要在不需要的时候编写不可移植的代码呢?如果您设置了
SHELL=/bin/bash
,那么您的makefile将在不提供
/bin/bash
的系统上失败。