使分割字符串获取最后一个元素

Geo*_*ler 3 string bash split makefile gnu-make

在 bash 中,我可以拆分一个字符串,类似于 How to split a string in shell and get the last field

foo=1:2:3:4:5
echo ${foo##*:}
Run Code Online (Sandbox Code Playgroud)

如何在 makefile 中使用 make 实现类似的效果?我发现的任何解决方案都比 bash 吊坠复杂得多。

我尝试使用: $(shell ${foo##*:})但这失败了,因为字符串似乎没有正确终止。

Ren*_*let 9

如果foo是 make 变量

\n\n

来自GNU make 手册文本函数部分

\n\n
\n

$(subst from,to,text)对文本\n text执行文本替换:每次出现的from都被替换为to。结果将替换函数调用。

\n
\n\n

所以:

\n\n
$(subst :, ,$(foo))\n
Run Code Online (Sandbox Code Playgroud)\n\n

通过用空格foo替换所有内容来分割 make 变量的内容。:仍来自 GNU make 手册:

\n\n
\n

$(lastword names\xe2\x80\xa6)参数名称被视为一系列由空格分隔的名称。该值是系列中的\n 姓氏。

\n
\n\n

所以:

\n\n
$(lastword $(subst :, ,$(foo)))\n
Run Code Online (Sandbox Code Playgroud)\n\n

应该做你想做的事。演示(host>是shell提示符):

\n\n
host> cat Makefile\nfoo := 1:2:3:4:5\n\nall:\n    $(info $(lastword $(subst :, ,$(foo))))\nhost> make\n5\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果foo是 shell 变量

\n\n

你必须:

\n\n
    \n
  1. $在将配方传递到 shell 之前,保护配方的标志免受 make 执行的第一次扩展的影响,
  2. \n
  3. 考虑一下配方的每一行都是由一个单独的 shell 执行的:如果您在一行上定义 shell 变量并在另一行上使用它,则它不会按您预期的方式工作。
  4. \n
\n\n\n\n
all:\n    @foo=1:2:3:4:5 && \\\n    echo $${foo##*:}\n
Run Code Online (Sandbox Code Playgroud)\n\n

应该做你想做的事:$符号被正确转义,并且它是一个单行配方(感谢尾随\\)。演示:

\n\n
host> cat Makefile\nall:\n    @foo=1:2:3:4:5 && \\\n    echo $${foo##*:}\nhost> make\n5\n
Run Code Online (Sandbox Code Playgroud)\n