Makefile在循环中更改变量

时间:2017-12-04 01:34:01

标签: bash shell makefile

我正在尝试更改循环内的变量但是我失败了一些错误。这是我的makefile的一部分。

export CLOCK_PERIOD = 30;
syn_clock: 
    for number in 1 2 3 4 ; do \
        echo $$CLOCK_PERIOD; \
        echo $$number; \
        $$CLOCK_PERIOD = $$number; \
    done

make syn_clock的结果失败了以下几行:

bash-4.2$ make syn_clock
for number in 1 2 3 4 ; do \
        echo $CLOCK_PERIOD; \
        echo $number; \
        $CLOCK_PERIOD = $number; \
done
30
1
/bin/sh: line 3: 30: command not found
30
2
/bin/sh: line 3: 30: command not found
30
3
/bin/sh: line 3: 30: command not found
30
4
/bin/sh: line 3: 30: command not found
make: *** [syn_clock] Error 127

我希望CLOCK_PERIOD在循环周期中从1变为4。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

正如在this comment中已经建议的那样,在分配给Bash shell中的变量时,删除赋值运算符周围的空格和要分配的变量名称中的尾随$。也就是说,CLOCK_PERIOD=$$number代替$$CLOCK_PERIOD = $$number

由于Makefile中的export CLOCK_PERIOD = 30;将由make而不是shell运行,因此结果可能与您预期的不同(CLOCK_PERIOD的值为30;而不是30)。因此,我还删除了this comment中建议的尾随分号。

建议的解决方案是:

export CLOCK_PERIOD = 30
syn_clock: 
    for number in 1 2 3 4 ; do \
        echo $$CLOCK_PERIOD; \
        echo $$number; \
        CLOCK_PERIOD=$$number; \
    done

$的双$中的第一个$$number实际上与Makefile相关:它用于转义Makefile中的第二个$,以便shell收到$,否则,如果只写$numbermake会将其解释为${n}umber,即:make会扩展变量的值{ {1}}此结果将与n连接。那就是shell会收到的。