我想在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
更有用。
不能将make函数与shell变量组合。。。所有make函数都会先扩展,然后将生成的脚本传递给要运行的shell。当shell得到脚本时,里面就没有更多的make函数了(如果有,shell就不知道该怎么处理它们了!)
您的subst在文字字符串$x
上运行,该字符串没有/
,因此没有任何内容可替换,并生成$x
,shell将其扩展为字符串hello/world
。
如果必须处理shell变量值,则必须使用诸如sed
或tr
之类的shell命令,而不是make的subst
函数:
foo:
x="hello/world" ;
echo $$x | tr / -
您可以将x
定义为make
变量:
生成文件:
x = foo bar baz
t:
@echo $(subst bar,qux,$(x))
输出:
make
foo qux baz
版本:
make --version
GNU Make 3.81