如何在Makefile中正确编写for循环

问题描述 投票:0回答:1

我浏览了一些帖子,但仍然不知道它是如何工作的。

我的要求是:

for i in *.json
do
  file = `echo $i |cut -d _ -f2`
  echo ${file}
  # do the rest tasks
done

如何将上述脚本转换为Makefile的目标?

这是我尝试过的

foo: 
    for i in *.json; do      \
       $(eval FILE = $(shell echo $$i |cut -d _ -f2));    \
       echo $(FILE) ;\
    done

但是它不起作用

shell makefile
1个回答
1
投票
使用$(eval)$(shell)是...甚至没有错。

foo: for i in *.json; do \ file=$$(echo "$$i" |cut -d _ -f2); \ echo "$$file"; \ done

请注意文件名变量的引用,=赋值运算符周围没有空格,以及将任何美元符号加倍,以便将其从make传递到外壳程序。

但是,shell为此提供了更好的机制;

foo: for i in *.json; do \ j=$${i#*_}; \ echo "$${j%%_*}"; \ done

或者也许

foo: printf '%s\n' *.json \ | sed 's/[^_]*_\([^_]*\)_.*/\1/'

如果只期望一个下划线,则可以进一步简化两者。

或者也许您只是在寻找

makefile_variable := $(foreach x,$(wildcard *.json),$(word 2,$(subst _, ,$x)))

© www.soinside.com 2019 - 2024. All rights reserved.