Bash 如何在makeshell命令中使用case语句?

Bash 如何在makeshell命令中使用case语句?,bash,makefile,Bash,Makefile,我有两个变量foo和bar,foo将有一个值,而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}-${ba

我有两个变量
foo
bar
foo
将有一个值,而
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在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
如何以这种方式将两个环境变量连接在一起,以便在生成文件中使用它们


当涉及到
make
时,我是一个彻头彻尾的傻瓜,所以如果我用了完全错误的方式,那么一定要让我知道。thx.

您可以在变量中隐藏右括号,如下所示:

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

default:
    echo ${foobar}

您不需要运行子shell来连接几个变量:

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

default:
    echo '$(foobar)'
应该很好用


您的第一个代码可以简化为
echo“${foo}${bar:+-}${bar}”
。我不确定第二部分:这些是实际的环境变量,还是制造变量,还是什么?这整件事感觉就像一个。foo和bar都是环境变量。这是有道理的,尽管它们仍然不起作用。我不再收到错误,但它只是回显一条空行。您是在逐字测试我们提供的内容,还是在使用更复杂的设置?我想这是后一种情况,因为它在这里工作。我的真实场景当然不同,但是的,我正在逐字测试你在这里放的内容。很奇怪。我在MacOS上,以防这会有什么不同,但我看不出会有什么不同。哦…我愚蠢的错误。我没有导出foo&bar变量。现在我有了,而且很有效。谢谢。那是香蕉我还看到有人举了一个例子,将整个case语句保存到var并执行$(shell${command_str})。真的没有简单的方法可以在一个案例陈述中逃脱正确的角色吗?很好,谢谢。虽然我还没有得到我需要的。我怀疑我遇到了和我向程序员报告的问题一样的问题,仍然只是重复一条空行。我猜我的目标中的echo不像我假设的那样工作。@jamiet好吧,我知道我的代码可以工作(请参阅实时演示链接)。我不知道你在做什么,同意。我也没有:(Thx目前正在寻求帮助,试图弄清真相。哦……我愚蠢的错误。我没有导出foo&bar变量。现在我已经导出了,并且它可以工作了。谢谢。这里发布了两个解决方案(来自melpomene&@AProgrammer)这是我喜欢的一个,原因很明显。感谢程序员修复了我的代码,感谢melpomene提出了更好的建议。