2013-04-16 32 views
8

未設置(編輯:問題更準確的基礎上@邁克爾反饋)獲得一個默認值時,變量是在化妝

在bash中,我經常使用parameter expansion:以下命令打印「default value」當$VARNAME未設置,否則,它打印VARNAME內容。

echo ${VARNAME:-default value} #if VARNAME empty => print "default value" 
echo ${VARNAME-default value} #if VARNAME empty => print "" (VARNAME string) 

did not find在GNU make了類似的功能。 我終於在我的Makefile寫道:

VARNAME ?= "default value" 
all: 
     echo ${VARNAME} 

但我不滿意這個解決方案:它總是創建變量VARNAME,這可能會改變一些makefile文件的行爲。

有沒有更簡單的方法來獲得未設置的變量的默認值?

回答

10

如果你想使用GNU的擴張使變量,如果它是非空,如果是空的默認值,但不能設置變量,你可以做這樣的事情:

all: 
     echo $(or $(VARNAME),default value) 
+0

好的答案... – devnull

+0

只是爲了完整,bash的'$ {VARNAME-default}'(無':')的make版本是' $(如果$(過濾器未定義,$(原始VARNAME),默認,$ {VARNAME})'。(Appologgies,如果我輸入錯誤。) – bobbogo

1

如果你想測試一個變量具有非空值,可以使用:

ifeq ($(VARNAME),) 
     VARNAME="default value" 
else 
     do_something_else 
endif 

爲了檢查一個變量是否被定義或沒有,使用ifdef

有關更多信息,請參閱手冊中的Syntax of Conditionals

+0

謝謝,這是一個可能的解決方案,但不像「VARNAME?=」默認值「(注意:我不想創建/更改變量VARNAME)那麼簡單。歡呼聲 – olibre

+0

上面提到的代碼段不會創建/更改'VARNAME'。它只是檢查它是否具有非空值,並且將評估爲假(1)是否存在「VARNAME」,或者(2)如果「VARNAME」爲空。無論哪種情況,它都不會創建'VARNAME'。您可以稍後使用'ifdef($(VARNAME))'來驗證! – devnull

+0

哎呀,你是對的,我的道歉。我正在尋找更方便使用的東西(如@瘋狂科學家的答案)。我想告訴你,我傾向於使用'VARNAME?=「默認值」(即使它創建了一個變量),而不是上面的5行代碼片段(我的觀點)。我給你+1,因爲你的解決方案是正確的。我認爲@MadScientist的答案很好,請給他+1 ;-)謝謝你的幫助。乾杯。 – olibre

0

只要刪除冒號。如果在替換中使用:-,如果變量爲空,空字符串或它不存在,將使用默認值,但如果變量未定義,僅使用-本身將僅替換默認值。

# var1=default 
# var2= 

# echo var2 is ${var2:-$var1} 
var2 is something 
# echo var3 is ${var3:-$var1} 
var3 is something 

# echo var2 is ${var2-$var1} 
var2 is 
# echo var3 is ${var3-$var1} 
var3 is something 
+1

謝謝你區分':'和'-'。我編輯我的問題更準確。但是你的答案是shell,它不適用於makefile ... – olibre