2013-07-01 16 views
12

Ho letto la pagina man di bash su questo, ma non capisco la differenza. Ho provato entrambi fuori e sembrano produrre esattamente gli stessi risultati.

Desidero impostare un valore predefinito di una variabile se il valore non è stato impostato tramite un parametro della riga di comando.

#!/bin/bash 

var="$1" 
var=${var:-word} 
echo "$var" 

Il codice sopra echi word se $1 è nullo ed echi valore $1 se non nullo. Così fa questo:

#!/bin/bash 

var="$1" 
var=${var:=word} 
echo "$var" 

Secondo la pagina man di Bash,

${parameter:-word} utilizzare i valori predefiniti. Se il parametro non è impostato o è nullo, l'espansione della parola viene sostituita. Altrimenti, il valore del parametro viene sostituito.

${parameter:=word} Assegna valori predefiniti. Se il parametro non è impostato o è nullo, l'espansione della parola viene assegnata al parametro. Il valore del parametro viene quindi sostituito. I parametri posizionali e i parametri speciali non possono essere assegnati in questo modo.

È che sono uguali e lo ${parameter:=word} fa solo di più?

risposta

12

Non si può vedere la differenza con i tuoi esempi, come si utilizza var due volte, ma si può vedere con due variabili differenti:

foo=${bar:-something} 

echo $foo # something 
echo $bar # no assignement to bar, bar is still empty 

foo=${bar:=something} 

echo $foo # something 
echo $bar # something too, as there's an assignement to bar 
14
${var:=word} 

uguale

var=${var:-word} 
+0

Bello e conciso. – JAB

+0

Fantastica spiegazione, mi piace anche che sia breve e concisa. Ho dato la risposta accettata a Guilaume per la spiegazione extra e per avere la prima risposta. Grazie! –

+0

per buona misura, ho anche svalutato questa risposta;) – Guillaume

6

La differenza è tra uso e assegnazione. Senza =, il valore word è utilizzato, ma non in realtà assegnato a a var.

Questo è il più importante nel caso di variabili che sono di sola lettura - che è dove non è possibile assegnare ad esse.

Ad esempio, non è possibile assegnare i parametri posizionali numerati. Quindi, se volete la funzione di gestire un primo parametro opzionale con un default, è possibile utilizzare il codice come:

${1:-default} 

Non è possibile utilizzare la versione ${1:=default} lì, dal momento che non è possibile assegnare al parametro posizionale 1. È di sola lettura.

+0

Non lo sapevo! Grazie per l'informazione –

2

A volte vedere l'espansione incarico con la : command:

# set defaults 
: ${foo:=bar} ${baz:=qux} 
Problemi correlati