2

考虑下面的make文件

全部:
     @for x in yz; \
     做 \
          对于 bc 中的 a;\
          做 \
                   回声 $$x$$a >> log_$$x; \
          完毕; \
     完毕

在执行这个 make 文件时,创建了两个文件 log_y 和 log_z。log_y 有数据“yb”和“yc”。同样,log_z 有数据“zb”和“zc”。

实际上我想创建四个文件(log_y_b、log_y_c、log_z_b、log_z_c)。为此,我将上面的 make 文件修改为,

全部:
     @for x in yz; \
     做 \
          对于 bc 中的 a;\
          做 \
                   回声 $$x$$a >> log_$$x_$$a; \
          完毕; \
     完毕

但它只创建一个文件 log_。我应该怎么做才能创建四个文件。

4

2 回答 2

4

也许在变量名周围加上大括号:它适用于我的系统。

all:
    @for x in y z; \
    do \
        for a in b c; \
        do \
            echo $$x$$a >> log_$${x}_$${a}; \
        done; \
    done

您还可以使用foreach

all:
    @$(foreach x,y z,$(foreach a,b c,echo $(x)$(a) >> log_$(x)_$(a);))
于 2011-02-01T17:10:36.247 回答
1

log_$$x_$$aMakefile中变成了log_$x_$afor shell,相当于log_${x_}${a}. 但是,该变量$x_未定义,因此 shell 将其替换为空字符串。

$x解决方案:在变量名( ) 周围用大括号正确编写变量${variablename},即为了保持一致性写入log_${x}_${a}(或使用Makefile样式:log_$${x}_$${a})。

于 2011-02-01T17:08:43.290 回答