如何在make shell命令中使用case语句?

时间:2019-03-04 14:31:36

标签: bash makefile

我有两个变量foobarfoo将有一个值,而bar可能有也可能没有。如果bar有值,我想将它们连接在一起,并用连字符隔开。我有一些可以在bash中工作的东西:

$ foo=foo
$ bar=bar
$ case "${bar}" in    "") echo $foo ;;   *) echo ${foo}-${bar}; esac
foo-bar
$ unset bar
$ case "${bar}" in    "") echo $foo ;;   *) echo ${foo}-${bar}; esac
foo

到目前为止,一切都很好。现在,我想使用make的shell function在Makefile中执行相同的操作,但是我无法弄清楚语法。这里演示了问题:

$ cat Makefile
foobar = $(shell $(case "$${bar}" in    "") echo $${foo} ;;   *) echo $${foo}-$${bar};; esac))

default:
    echo ${foobar}
$ make
/bin/sh: -c: line 0: syntax error near unexpected token `;;'
/bin/sh: -c: line 0: `echo ${foo} ;;   *'
echo  echo ${foo}-${bar};; esac))
/bin/sh: -c: line 0: syntax error near unexpected token `;;'
/bin/sh: -c: line 0: `echo  echo ${foo}-${bar};; esac))'
make: *** [default] Error 2

如何以这种方式将两个环境变量连接在一起,以便可以在我的Makefile中使用它们?

关于make,我是一个完全的菜鸟,因此,如果我完全以错误的方式进行此操作,请告诉我。谢谢。

2 个答案:

答案 0 :(得分:2)

您不需要运行子shell来连接一些变量:

foobar := $(foo)$(if $(bar),-,)$(bar)

default:
    echo '$(foobar)'

应该可以正常工作。

Live demo

答案 1 :(得分:1)

您可以在这样的变量中隐藏“用右括号括起来”:

cp=)
foobar:= $(shell case "$${bar}" in    ""${cp} echo $${foo} ;;   *${cp} echo $${foo}-$${bar};; esac)

default:
    echo ${foobar}