【问题标题】:How to properly write for loop in Makefile如何在 Makefile 中正确编写 for 循环
【发布时间】:2020-04-29 20:44:23
【问题描述】:

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

我的要求是:

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】:

使用$(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)))

【讨论】:

  • 非常感谢。为什么输出不同:$${file}$(file)
  • 以及如何在目标中使用makefile_variable
  • 如前所述,双美元符号被传递到外壳,而单美元符号由make 自己评估。要让make 插入变量,只需像引用任何变量一样引用它:$(makefile_variable)。如果您需要帮助,请提出一个新问题(但请先搜索和/或阅读一些文档)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-21
  • 1970-01-01
  • 2019-12-18
  • 2016-01-21
  • 1970-01-01
  • 2010-09-08
  • 2022-01-27
相关资源
最近更新 更多