如何在Makefile循环中根据计数器获取对应变量内容?
Makefile循环遍历带计数器的变量并打印内容
先给你能直接运行的Makefile示例,实现遍历G_1到G_4并打印内容:
NUM_CMDS := 4 G_1 := "内容1" G_2 := "内容2" G_3 := "内容3" G_4 := "内容4" .PHONY: print_vars print_vars: @for i in $$(seq 1 $(NUM_CMDS)); do \ eval echo "变量G_$$i的值: \$${G_$$i}"; \ echo "------------------------"; \ done
运行make print_vars会输出:
变量G_1的值: "内容1"
变量G_2的值: "内容2"
变量G_3的值: "内容3"
变量G_4的值: "内容4"
关键要点解释
eval的必要性:
你之前直接用echo $${G_$$i}失败,是因为shell只会把G_$i当作一个未定义的shell变量,而Make定义的G_1等变量需要先被shell识别。eval会先将G_$$i解析为实际的变量名(比如G_1),再执行echo命令取值。- 转义符的正确使用:
$$i:转义成shell层面的$i,表示循环计数器。\$${G_$$i}:第一层$$转义为shell的$,G_$$i解析为G_1后,${G_1}就会取到Make定义的变量值。
- Makefile格式要求:
循环体的每一行末尾必须加\,命令行必须用tab键缩进(不能用空格),否则Make会报错。
相关技术参考知识点
- 变量展开方式:用
:=定义NUM_CMDS是立即展开,确保循环时取值固定;如果用=是延迟展开,可能会导致意外结果。 - Shell命令执行规则:Make默认每行命令启动一个新shell进程,所以循环必须用
\连写成一个命令块,或者给目标加.ONESHELL属性,让整个命令块在同一个shell中执行。 - Shell
eval命令:用于动态解析并执行命令字符串,适合处理需要动态构造变量名的场景。
内容的提问来源于stack exchange,提问作者Sophia Goulimis
相关产品推荐
相关产品推荐

