我不确定我是否正确描述了这个问题,但目前我正在通过以下方式解决这个问题
QUOTEDSTR := "hello world"
NORMALSTR := $(shell echo $(QUOTEDSTR))
有没有更内置的方式可以让“make”在不调用 shell 的情况下做到这一点?谢谢
我不确定我是否正确描述了这个问题,但目前我正在通过以下方式解决这个问题
QUOTEDSTR := "hello world"
NORMALSTR := $(shell echo $(QUOTEDSTR))
有没有更内置的方式可以让“make”在不调用 shell 的情况下做到这一点?谢谢
另外的选择:
NORMALSTR := $(patsubst "%",%,$(QUOTEDSTR))
Beta 的答案将删除字符串中的每个引号。上述解决方案只会删除出现在开头和结尾的引号。例如:
QUOTEDSTR := -DTITLE=\"Title\"
Beta 的答案将产生一个值,-DTITLE=\Title\
而使用 patsubst 解决方案时,该值不会改变。
这取决于你想要什么。
编辑
如果您想根据@stefanct 的评论处理空格并且仍然只匹配变量开头/结尾的引号,您将不得不玩一些技巧。首先,您需要找到一个您知道永远不会出现在您的字符串中的非空白字符。让我们选择^
,但如果你愿意,你可以选择其他东西。
算法是:将所有空格转换为该字符,然后从生成的单个“单词”中删除引号,然后将该字符的所有实例转换回空格,如下所示:
# Get a variable S that contains a single space
E :=
S := $E $E
NORMALSTR := $(subst ^,$S,$(patsubst "%",%,$(subst $S,^,$(QUOTEDSTR))))
当然还有一些并发症;例如,这仅处理空格,而不处理其他空白字符,例如 TAB。
这应该这样做:
NORMALSTR := $(subst $\",,$(QUOTEDSTR))
所有答案都有问题。patsubst
“[f]inds 空格分隔的单词”所以@MadScientist 的简单解决方案不适用于像"hello world"
. 另一方面,@Beta 的一个删除所有引号字符,无论它们在哪里。
下面的代码也展示了如何处理带有空格的字符串。但是,它也会删除单词边缘的其他引号字符,例如"hello "world"3"
将转换为hello world"3
. 如果那更好...我不知道,可能不是。
与其他解决方案不同,此解决方案创建了一个名为的用户函数unquote
,而不是直接替换字符串。
quoted="hello world"
unquote = $(patsubst "%,%,$(patsubst %",%,$(1)))
#unquote = $(subst $\",,$(1))
#unquote = $(patsubst "%",%,$(1))
#unquote = $(shell echo $(1))
unquoted = $(call unquote,$(quoted))
$(info Variable quoted is $(quoted))
$(info Variable unquoted is $(unquoted))
这只是在每个(空格分隔)单词的开头和结尾查找所有引号字符并将其删除。
NORMALSTR := $(subst $\",,$(QUOTEDSTR))
等于
NORMALSTR := $(subst ",,$(QUOTEDSTR))
因为你没有定义 $\ 变量,所以它是空字符串
$\"
避免在编辑器中出现语法高亮问题。
",,$(QUOTEDSTR))
将被编辑器识别为字符串,直到找到另一个"
.