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提出了更好的建议。