Forfile中的循环无效

时间:2011-06-04 11:00:07

标签: shell makefile sed grep ed

我有一个单行脚本传入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)

它工作正常。

我还尝试了shell for循环,如下所示:

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

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

2 个答案:

答案 0 :(得分:7)

太多而且没有足够的$符号!这列出了* .txt文件 - 请注意$$ F:

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

答案 1 :(得分:0)

解决方案是:在以$开头的序列之前再添加一个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)