2012-09-08 18 views
1

我瞭解字符串操作使用bash,更特別是關於更換子串:巴什 - 字符串操作Makefile中

#! /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只打印一個空行。 我覺得我誤解了一些東西,但無法弄清楚什麼。任何幫助將非常感激。

回答

5

無需在VAR1和VAR2附近放置雙引號。而你需要使用export如果你想要把VAR1和VAR2以上all:

SHELL:=/bin/bash 

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

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

+1比我的修復更簡單。 – chepner

+0

非常好的和有用的技巧,謝謝! – Muja

0

bash和賺不具有相同的̶s̶y̶n̶t̶a̶x̶.̶̶你需要你可以使用內置的功能,讓喜歡(在這種情況下)$(substr a,b,c)

See this

+0

我知道那些內置的功能,但我想包括本地的Makefile慶典。謝普納給了我我正在尋找的東西。無論如何,非常感謝您花時間回答我:) – Muja

3

的問題是,VAR1VAR2不是shell變量,而是Makefile變量。 爲了使問題複雜化。此外,在生成文件配方的每一行中的單獨殼進程,這意味着以下幼稚嘗試將失敗時執行:

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

因爲VAR1在一個殼中定義,在另一個VAR2,並且在第三個變量中沒有定義變量的情況下爲echo。您可以使用下列內容:

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

有一個bash語句(全部在一個shell中執行)分割成在Makefile多行。

+0

這正是我一直在尋找的東西,並且您的解釋很明確。我想到了一些變量的「範圍」,但沒有找到任何有關這方面的信息。謝謝 ! – Muja

+0

你不需要大括號。反斜槓足以確保命令在shell的單個實例中執行。 – Idelic

+0

@Idelic:是的,你是對的。這簡化了一點。 – chepner