Makefile中的Shell条件语句

13

我无法让它工作,尝试了条件[]、bash括号、引号等等。

如果$$?!= "0"从不匹配,但$$?有时非零。有什么想法吗?

test: testdrivers
-@rc=0; \
   for file in $(TSTFILES); do  \
     ./$$file; \
     if  $$? != "0" ; then  \
     echo test fail;\
                 rc=`expr $$rc + 1` ;\
     fi \
    done; \
  echo; echo "Tests failed: $$rc"
2个回答

19

在shell脚本中进行数字比较的正确语法是:

if [ $$? -ne 0 ]; then

请确保在方括号之前和之后有空格,不能与参数在同一单词中。

此外,在fi后面缺少一个分号:

    fi; \
done; \

1
我可能会说类似于“在左方括号两侧并且在右方括号之前”的表述,因为你使用的 ]; 也是可以的。尽管我承认这样说可能没有那么简明扼要。 - Etan Reisner
不妨说[实际上就是test这个外部程序(尽管它很可能是大型shell内置的)。所以,查看test的手册。 - keltar
那么就有其他问题了。基于您的示例,我提供的语法肯定可行。"不起作用"是什么意思?你输入了什么命令?你看到了哪些错误?请直接剪切粘贴,而不是重新输入,因为重新输入通常会引入微妙的变化,使问题无法解决。编辑您的问题并将您当前的makefile规则剪切粘贴。 - MadScientist
它只是不符合条件,我没有收到任何错误,但我可以回显$rc并看到它不为零...也许因为它不是bash,我应该只调用一个脚本。 - user1496062
将其拆分为单独的脚本,这样更好。 - user1496062
我不明白。如果$rc变量非零,则条件“必须”为真,因为这是脚本中(至少在您展示的部分)唯一设置> 0的变量。那么你所说的“不符合条件”是什么意思?为什么你这样认为?如果它在单独的脚本中起作用,那么您可能存在反斜杠和分号或正确引用变量的问题。如果您对现有内容满意,请继续使用。如果您想了解自己做错了什么,请阅读我的上面的评论并提供所请求的详细信息。干杯! - MadScientist

4

以下内容作为示例:

SHELL=/bin/bash
abc=all 
all:
    @ echo $(SHELL)
    @if [ $@ == $(abc) ]; then echo hi; fi;
    @echo done

输出将为:
/bin/bash
hi
done

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接