我想在Makefile中执行字符串替换。我可以使用字符串文字轻松地完成此操作:
foo:
echo $(subst /,-,"hello/world")
产生预期的结果:
hello-world
但是当我切换到使用变量时,我似乎无法取代替代:
foo:
x="hello/world" ; \
echo $(subst /,-,$$x)
我没有用破折号替换斜线,而是还打印回原始字符串。有人能解释一下这里发生了什么吗?变量是否需要显式转换为字符串文字或什么?
基于MadScientist答案的修复 - 这将允许我将修改后的字符串作为变量引用。
foo:
x="hello/world" ; \
y=`echo $$x | tr / -` ; \
echo $$y
但这不是echo $$y
,而是更有用。
答案 0 :(得分:4)
你不能将make函数与shell变量结合起来......所有make函数都先扩展 ,然后将生成的脚本传递给要运行的shell。当shell获取脚本时,其中不再有make函数(如果有的话,shell将不知道如何处理它们!)
您的子文件正在文字字符串$x
上运行,该字符串没有/
,因此无法替换任何内容并生成$x
,其中shell扩展为字符串hello/world
如果必须处理shell变量值,则必须使用shell命令,例如sed
或tr
,而不是make subst
函数:
foo:
x="hello/world" ; \
echo $$x | tr / -
答案 1 :(得分:0)
您可以将 x
定义为 make
变量:
Makefile:
x = foo bar baz
t:
@echo $(subst bar,qux,$(x))
输出:
make
foo qux baz
版本:
make --version
GNU Make 3.81