我浏览了一些帖子,但仍然不知道它是如何工作的。
我的要求是:
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
但是它不起作用
$(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)))