我有一个包含以下内容的makefile:
M_ONE = 1
M_TWO = 2
M_THREE = 3
NUMBERS = $(foreach v, $(shell echo "$(.VARIABLES)" | sed 's/ /'$$"\n"'/g' | grep "^M_" | xargs), $(info $(v)=$($(v))))
get-numbers:
numbers=$(NUMBERS) ;\
echo -e "numbers: \n$$numbers" ;\
echo -e "NUMBERS: \n$(NUMBERS)"
我的变量以相同的模式开头,这里" M _"。我希望在运行时检索这些变量的所有值,并为每个变量执行一些shell任务。
当我执行命令时,我得到的是:
$ gmake --silent get-numbers
M_TWO=2
M_ONE=1
M_THREE=3
M_TWO=2
M_ONE=1
M_THREE=3
numbers:
NUMBERS:
好像变量'数字'空了我不明白为什么我逃脱了它的宣言。实际上,就好像即使是gmake变量' NUMBERS'也是空的。
我想要做的是循环使用" key = values"并做一些文件处理(sedding)。我怎样才能解决这个问题,或者考虑不这样做的另一种方法呢?
答案 0 :(得分:1)
对于你想做的事情来说,这似乎是很多工作。
您的NUMBERS = ...表达式未将'$(info...)'
命令输出分配给NUMBERS;它立即写入stdout;然后执行echo
命令(因此不按顺序输出)。
使用GMAKE为您提供的所需内容的简单方法可能是:
M_ONE = 1
M_TWO = 2
M_THREE = 3
get-numbers : $(filter M_%, ${.VARIABLES:=.print})
%.print :;@ echo $*=${$*}
是的,这也不提供数字:NUMBERS:标签。假设您想要的信息不仅仅是格式化,这是公平的吗?
HTH