String 使拆分字符串获取最后一个元素
在bash中,我可以拆分类似于 如何在makefile中实现与make类似的功能?我找到的任何解决方案都比bash挂件复杂得多 我尝试使用:String 使拆分字符串获取最后一个元素,string,bash,makefile,split,gnu-make,String,Bash,Makefile,Split,Gnu Make,在bash中,我可以拆分类似于 如何在makefile中实现与make类似的功能?我找到的任何解决方案都比bash挂件复杂得多 我尝试使用: $(shell${foo###*:})但这失败了,因为字符串似乎没有正确终止。如果使用a,将转义美元,然后可以将其传递给shell e、 如果foo是一个make变量,则在makefile中的echo$$${foo###*.} 从以下地址: $(subst from,to,text)对文本执行文本替换 text:每次出现的from都替换为to。结果是 替
$(shell${foo###*:})
但这失败了,因为字符串似乎没有正确终止。如果使用a,将转义美元,然后可以将其传递给shell
e、 如果foo
是一个make变量,则在makefile
中的echo$$${foo###*.}
从以下地址:
$(subst from,to,text)
对文本执行文本替换
text:每次出现的from都替换为to。结果是
替换函数调用
因此:
通过将所有:
替换为空格,拆分make变量foo
的内容。仍然来自GNU make手册:
$(lastword名称…
参数名称被视为一系列
名称,用空格分隔。该值是列表中的姓氏
系列
因此:
你应该做你想做的。演示(host>
是shell提示符):
如果foo
是shell变量
你必须:
$
符号不受make在将配方传递到shell之前执行的第一次扩展的影响$
符号被正确转义,它是一个单行配方(多亏了后面的\
)。演示:
我知道这个问题是
gnumake
-相关的,但我想展示一下bsdmake
中的问题有多简单:
FOO=1:2:3:4:5
all:
@echo ${FOO:C/.*://}
以及测试:
$ make
5
解释():${FOO:C/*://}
命名变量修饰符中的:C..
。:C
修饰符的工作方式类似于sed
的s
命令。在这种情况下,它会将变量${FOO}
中的所有单词更改为类似于sed
的表达式定义的所有单词:将所有字符和尾随冒号替换为零(也称为删除它)
请注意,
*:
表达式是贪婪的(与往常一样,*
可以包含许多冒号)。它是生成文件中的字符串还是变量?如果它是一个变量,那么您可以为该文件提供源代码并回显该变量。请更详细地解释,并给出您所指的makefile部分的示例。另外,您想更改该文件还是以某种方式使用输出?我只想使用输出。调用makefile时传递变量,即make myvar=my/value/last.thing mytask
@GeorgHeiler,因此,它是一个make变量,而不是shell变量。在您的示例<代码> ECHOR$(LASTWORD $(SUST/($(MyVar)))< /C>中做您想要的(请参阅我的详细解释的答案)。请问您是否也觉得太复杂而无法考虑?请参阅已接受的答案-NO。
$(lastword $(subst :, ,$(foo)))
host> cat Makefile
foo := 1:2:3:4:5
all:
$(info $(lastword $(subst :, ,$(foo))))
host> make
5
all:
@foo=1:2:3:4:5 && \
echo $${foo##*:}
host> cat Makefile
all:
@foo=1:2:3:4:5 && \
echo $${foo##*:}
host> make
5
FOO=1:2:3:4:5
all:
@echo ${FOO:C/.*://}
$ make
5