Makefile循环中shell命令变量无法动态替换的解决咨询
解决Makefile循环中动态变量替换的问题
你的问题出在Make的解析顺序和shell执行顺序不匹配上:Make会先把规则里所有$(...)格式的语法全部解析完,才会把剩下的内容传给shell去执行。所以你写的$(eval version3=$(shell sh -c "./a.sh $$version_i" ))在Make解析阶段就跑了,这时候$$version_i还没被shell替换成循环里的实际版本值,自然拿不到正确结果。
直接把逻辑全放到shell层面处理就行,不要混用Make的函数在shell循环里,修改后的Makefile规则如下:
.PHONY: test-api4 test-api4: $(HOME)/.halctl for version_i in $(candidate_versions); do \ echo "version_i : $$version_i"; \ version3=$$(./a.sh "$$version_i"); \ echo "$$version3"; \ done
关键修改点:
- 用shell的命令替换
$$(...)代替Make的$(shell ...):Make会把$$转义成单个$,shell执行时就会变成version3=$(./a.sh "$version_i"),能正确获取当前循环中version_i对应的脚本输出。 - 去掉Make的
$(eval):不需要在Make层面定义变量,直接用shell变量存储结果即可。 - 给
$$version_i加引号:如果版本号包含空格或特殊字符,能避免shell错误拆分参数。
内容的提问来源于stack exchange,提问作者Sangeet
相关产品推荐
相关产品推荐

