makefile if / else

时间:2018-09-13 09:42:58

标签: linux shell makefile gnu-make gnu

我需要添加if else语句, 如果值== {app1打印x否则打印y

我尝试了以下方法 但是当我添加else时出现语法错误,

我在做什么错了?

runners:
    @for a in $(apps) ; do
       if (( a ==  "app1"));then
        echo first: $$v ;
       else
        echo second: $$v ;
        fi
     done

3 个答案:

答案 0 :(得分:1)

1)我更喜欢使用bash作为我的shell,因为我已经习惯了它。因此,我在生成文件的顶部使用SHELL:=/bin/bash。但是当系统不提供/ bin / bash时,整个makefile文件就会失败。

2)如果要对配方中的所有行使用相同的外壳,则可以使用特殊的目标.ONESHELL,这样可以防止在每行后面都没有空格后使用;\(容易出错)。但是,如果您使用.ONESHELL,那么这对于makefile中的所有配方都是正确的(我使用过,但您可能不想要)。

3)如果runners不是文件(并且看起来像,因为您没有在配方中创建文件),我建议将其制作为.PHONY。当碰巧有一个名为runners的文件时,这将阻止make执行它。

4)双括号((...))用于算术扩展。它根本无法比较字符串。使用单括号或双括号。参见this great post

5)我还认为您想打印a,因此将$$v替换为$$a

因此,总的来说,只要您具有/ bin / bash,它就可以很好地工作:

SHELL:=/bin/bash
.ONESHELL:
.PHONY: runners
apps:=app2 app3 app1 app5
runners:
    @for a in $(apps) ; do  <<-- ; between commands as usual
      if [[ "$$a" ==  "app1" ]]; then
        echo first: $$a  <<-- no need for ; because of .ONESHELL
      else
        echo second: $$a
      fi
    done
  

输出:

second: app2
second: app3
first: app1
second: app5

答案 1 :(得分:0)

Makefile:

apps=app1 app2

runners:
    @for a in $(apps) ; do \
        if [ $$a = "app1" ]; then \
            echo "first: $$a" ; \
        else \
            echo "second: $$a" ; \
        fi \
    done

可打印

  

第一:app1
  第二:app2

答案 2 :(得分:0)

保重:上面的解决方案仅在最新的“ make”版本(可能> 4)中运行。 例如,OSX包括Gnu make 3.81。因此,您需要使用Homebrew安装更新的品牌

brew reinstall make --with-default-names