【问题标题】:For loop in Makefile has no effectMakefile中的for循环没有效果
【发布时间】:2011-06-04 11:00:07
【问题描述】:

我有一个单行脚本传入Makefile中的foreach函数,如下图:

flag:
        $(foreach f, $*.txt, printf "%s\n" 0a "$(grep -o '[0-9]\+' $f | sed 's/.*/read \"&\"/')" "" . w q | ed $f)

可以在here 找到此脚本行的作用。我只是很困惑为什么它不能以这种方式工作,因为如果我将该行放入一个单独的脚本中并像这样从 Makefile 中调用它:

flag:
        $(forech f, $*.txt, ./script $f)

效果很好。

我也试过shellfor循环如下:

flag:
        for f in $*.txt ; do \
          printf "%s\n" 0a "$(grep -o '[0-9]\+' $f | sed 's/.*/read \"&\"/')" "" . w q | ed $f ; \
        done

仍然没有运气。我必须触及 Makefiles 的一些微妙点,有人可以启发我吗?谢谢。

【问题讨论】:

    标签: shell makefile sed grep ed


    【解决方案1】:

    $ 符号太多又不够!这列出了 *.txt 文件 - 注意 $$F:

    all:
        for F in *.txt ; do \
        echo $$F ; done 
    

    【讨论】:

    • 我试过你的方法,删除*.txt之前的$并在变量f的两次出现之前添加$,但它仍然不起作用。
    • 我已经解决了这个问题,谢谢你启发我,尼尔。确实是缺少$造成了麻烦。
    【解决方案2】:

    解决办法是:在grep开头的序列前多加一个$

    flag:
            $(foreach f, $*.txt, printf "%s\n" 0a "$$(grep -o '[0-9]\+' $f | sed 's/.*/read \"&\"/')" "" . w q | ed $f)
    

    或者使用旧的反引号

    flag:
            $(foreach f, $*.txt, printf "%s\n" 0a "`grep -o '[0-9]\+' $f | sed 's/.*/read \"&\"/'`" "" . w q | ed $f)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多