首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在make recipe中使用for循环

如何在make recipe中使用for循环
EN

Stack Overflow用户
提问于 2012-01-06 18:37:08
回答 3查看 29.1K关注 0票数 11

我想使用一个循环来查找一些文件并重命名它们:

代码语言:javascript
复制
  for i in `find $@  -name *_cu.*`;do mv $i "$(echo $i|sed s/_cu//)"
  done

这在shell中有效。但是我如何在makefile配方中做到这一点呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-06 20:28:58

在将非平凡的shell片段放到make食谱中时,您需要了解两件主要的事情:

配方中的

  1. 命令是(当然!)一次执行一个,其中command表示“配方中以制表符为前缀的行”,可能分布在带有反斜杠的多个makefile行中。

所以您的shell片段必须全部写在一行(可能有反斜杠)上。此外,它实际上是作为单行显示给shell的(反斜杠-换行符不是普通的换行符,因此shell不会将其用作命令终止符),因此必须在语法上正确。

  • 外壳变量和make变量都是由美元符号($@$i)引入的,因此您需要通过将它们编写为$$i来隐藏您的shell变量。(更准确地说,您希望被shell看到的任何美元符号都必须通过将其编写为$$.)

来从make中转义

通常,在shell脚本中,您将在单独的行上编写单独的命令,但在这里,您实际上只有一行,因此必须用分号分隔各个shell命令。将所有这些放到您的示例中会产生:

代码语言:javascript
复制
foo: bar
    for i in `find $@  -name *_cu.*`; do mv $$i "$$(echo $$i|sed s/_cu//)"; done

或者等效地:

代码语言:javascript
复制
foo: bar
    for i in `find $@  -name *_cu.*`; do      \
        mv $$i "$$(echo $$i|sed s/_cu//)";    \
    done

请注意,后者即使布局在几行上也同样需要小心使用分号才能使shell满意。

票数 34
EN

Stack Overflow用户

发布于 2016-12-27 05:49:04

我发现这很有用,尝试使用for循环来构建多个文件:

代码语言:javascript
复制
PROGRAMS = foo bar other

.PHONY all
all: $(PROGRAMS)
$(PROGRAMS):
    gcc -o $@ $@.c

它会将foo.c,bar.c,other.c编译成foor bar其他可执行文件

票数 4
EN

Stack Overflow用户

发布于 2021-10-07 20:12:11

我花了很多时间在这上面,最后让它工作了。我有一个简单的解决方案,使用makefile中的全局变量对所有目标可用,但我不想这样做,所以我就是这样做的。

代码语言:javascript
复制
target:
    $(eval test_cont=$(shell sh -c "docker ps | grep test" | awk '{print $$1}'))
    for container in $(test_cont);do \
        docker cp ssh/id_rsa.pub $${container}:/root/.ssh/authorized_keys; \
        docker exec -it $${container} chown root.root /root/.ssh/authorized_keys; \
    done
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8756522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档