我想做一个自定义函数,从序列1和关键字2中获取3美元作为indx.所以我检查了下面的一个函数,效果不错。
define get_indx
@echo $(words $1)
for n in $(shell seq 1 $(words $1)) ;\
do \
echo $$n ;\
done
endef
NLIST:= AA BB CC
$(call get_indx,$(NLIST),BB,indx)
但是下面的不能用,它说 "***非数字的第一个参数到`word'函数:'$n'。 '停止。
define get_indx
@echo $(words $1)
for n in $(shell seq 1 $(words $1)) ;\
do \
echo $$n ;\
echo $(word $$n, $1) ;\
done
NLIST:= AA BB CC
$(call get_indx,$(NLIST),BB,indx)
我怎样才能访问n或者怎样才能转换为数字?
如果你想创建一个自定义函数来从列表中获取索引,我想你不能把它作为一个参数来获取,因为函数的所有参数都是 在 仅限。你可以让你的函数输出一个文本,然后将其分配给一个变量,就像这样。
$ cat Makefile
NLIST := AA BB CC
# $1 - list to check
# $2 - element to find
# returns - index of element
define get_index
$(sort $(eval index_count :=) \
$(foreach word,$(1), \
$(eval index_count := $(index_count) x) \
$(if $(findstring $(word),$(2)),$(words $(index_count)))) \
)
endef
bb_index := $(call get_index,$(NLIST),BB)
$(info >$(bb_index)<)
$(info >$(call get_index,$(NLIST),CC)<)
$(info >$(call get_index,$(NLIST),AA)<)
这里的想法是,我们用一个列表作为计数器。对于原始列表中的每一个单词,我们通过向计数器列表中添加另一个值来增加计数器。实际的值并不重要,因为唯一重要的是计数器列表中元素的数量。如果我们找到了一个有趣的值,我们就会输出计数器列表中的元素数,它代表了找到元素的索引。然后这个输出可以像往常一样存储在一个变量中。这个 $(sort)
函数只是为了去掉多余的空格。
如果需要的话,这种方法可能需要变得更加复杂,这取决于具体情况(数值是否可能重复等)。
在for循环执行之前,输出。
$ make
>2<
>3<
>1<
$(word ...)
在for循环执行之前被替换,这意味着变量----------------。n
在替换过程中不存在。你可能想通过 --warn-undefined-variables
调试时调用make,想必在这种情况下会被发现。
至于解决方法,我可以考虑将你的 $(word ...)
与shell对应。也许是个好主意,把它全部包在一个脚本中,而不是用 define
块。