2013-04-16 4 views
8

(edit: domanda più precisa in base al feedback @ Michael)ottenere un valore predefinito quando variabile non è impostata nel make

In bash, io spesso uso parameter expansion: i seguenti comandi di stampa "default value" quando $VARNAME è disinserito in caso contrario, stampa il contenuto di VARNAME.

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

ho did not find una caratteristica simile su GNU make. fine ho scritto nel mio Makefile:

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

Ma io non sono contento di questa soluzione: si crea sempre la variabile VARNAME e questo può modificare il comportamento di alcuni makefiles.

C'è un modo più semplice per ottenere un valore di default sulla variabile non impostata?

risposta

10

Se si desidera utilizzare l'espansione di un GNU rendere variabile se si tratta di non-vuoto e un valore predefinito se è vuoto, ma non impostare la variabile, si può fare qualcosa di simile:

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

Nizza risposta ... – devnull

+0

solo per essere analmente completa, la versione di marca '$ di bash {VARNAME predefinite}' (senza ':') è ' $ (se $ (filtro undefined, $ (origine VARNAME), default, $ {VARNAME}) '. (Appologgies se ho digitato in modo errato.) – bobbogo

1

Se si desidera verificare se una variabile ha un valore non vuoto, è possibile utilizzare:

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

Per controllare se una variabile è stata definita o no, utilizzare ifdef.

Consultare Syntax of Conditionals nel manuale di più.

+0

Grazie, questa è una possibile soluzione, ma non semplice come "VARNAME? =" Valore predefinito "' (nota: non voglio creare/modificare la variabile 'VARNAME'). Cheers – olibre

+0

Lo snippet sopra menzionato non crea/modifica 'VARNAME'. Esso controlla semplicemente se ha un valore non vuoto e sarebbe valutato come falso (1) se 'VARNAME' esiste o no, o (2) se' VARNAME' è vuoto. In entrambi i casi, non creerebbe 'VARNAME'. Puoi usare 'ifdef ($ (VARNAME)) più tardi per verificare! – devnull

+0

oops, hai ragione, le mie scuse. Stavo cercando qualcosa di più comodo da usare (come la risposta di @ MadScientist). Volevo dirti che io preferisco usare 'VARNAME? = "Valore di default"' (anche se si crea una variabile) dai precedenti 5 linee-frammento (il mio punto di vista). Ti do +1 perché la tua soluzione è corretta. Io penso che la risposta di @ MadScientist sia buona, per favore digli anche +1 ;-) Grazie per il tuo aiuto. Saluti. – olibre

0

è sufficiente rimuovere il colon. Se si utilizza :- nella sostituzione, verrà utilizzato il valore predefinito se la variabile è nullo, una stringa vuota o non esiste, ma utilizzando solo - verrà sostituito solo il valore predefinito se la variabile non è stata definita.

# 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

Grazie per la distinzione tra ': -' e' -'. Modifico la mia domanda per essere più accurata. Ma la risposta è per il guscio, non funziona per makefile ... – olibre

Problemi correlati