3

我已经了解了使用 bash 进行字符串操作,尤其是关于子字符串替换:

#! /bin/bash

VAR1="aaaa.bbbb.cccc"
VAR2="bbbb*"
echo ${VAR1%${VAR2}}

此 bash 脚本打印“aaaa.”。我试图将它包含在我的makefile中,但我无法让它工作..

SHELL:=/bin/bash

VAR1="aaaa.bbbb.cccc"
VAR2="bbbb*"

all:
    @echo $${VAR1%$${VAR2}}

这个 Makefile 只打印一个空行。我想我误解了一些东西,但无法弄清楚是什么。任何帮助将非常感激。

4

3 回答 3

5

无需在 VAR1 和 VAR2 周围加上双引号。export如果你想把VAR1和VAR2放在上面,你需要使用all:

SHELL:=/bin/bash

export VAR1=aaaa.bbbb.cccc
export VAR2=bbbb*

all:
    @echo $${VAR1%$${VAR2}}
于 2012-09-08T17:40:41.703 回答
4

问题在于,VAR1不是VAR2shell 变量,而是 Makefile 变量。更复杂的是,Makefile 配方中的每一行都在单独的 shell 进程中执行,这意味着以下天真的尝试将失败:

all:
    VAR1="aaaa.bbbb.cccc"
    VAR2="bbbb*"
    @echo $${VAR1%$${VAR2}}

因为VAR1在一个 shell 中定义,VAR2在另一个 shell 中定义,而echo在第三个 shell 中都没有定义变量。您可以使用以下内容:

all:
    @VAR1="aaaa.bbbb.cccc"; \
     VAR2="bbbb*"; \
     echo $${VAR1%$${VAR2}};

将单个bash语句(全部在一个 shell 中执行)拆分为 Makefile 中的多行。

于 2012-09-08T17:27:50.143 回答
0

B̶a̶s̶h̶̶a̶n̶d̶̶M̶a̶k̶e̶̶d̶o̶̶n̶o̶t̶̶h̶a̶v̶e̶̶t̶h̶e̶̶s̶a̶m̶e̶̶s̶y̶n̶t̶a̶x̶.̶̶̶Y̶o̶u̶̶n̶e̶e̶d̶̶t̶o̶ 您可以使用内置 make 函数,例如(在这种情况下)$(substr a,b,c)

看到这个

于 2012-09-08T17:26:28.290 回答