You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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"

关键要点解释

  1. eval的必要性:
    你之前直接用echo $${G_$$i}失败,是因为shell只会把G_$i当作一个未定义的shell变量,而Make定义的G_1等变量需要先被shell识别。eval会先将G_$$i解析为实际的变量名(比如G_1),再执行echo命令取值。
  2. 转义符的正确使用:
    • $$i:转义成shell层面的$i,表示循环计数器。
    • \$${G_$$i}:第一层$$转义为shell的$,G_$$i解析为G_1后,${G_1}就会取到Make定义的变量值。
  3. Makefile格式要求:
    循环体的每一行末尾必须加\,命令行必须用tab键缩进(不能用空格),否则Make会报错。

相关技术参考知识点

  • 变量展开方式:用:=定义NUM_CMDS是立即展开,确保循环时取值固定;如果用=是延迟展开,可能会导致意外结果。
  • Shell命令执行规则:Make默认每行命令启动一个新shell进程,所以循环必须用\连写成一个命令块,或者给目标加.ONESHELL属性,让整个命令块在同一个shell中执行。
  • Shell eval命令:用于动态解析并执行命令字符串,适合处理需要动态构造变量名的场景。

内容的提问来源于stack exchange,提问作者Sophia Goulimis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 09:42:52