2013-02-28 16 views
22

Ho ereditato un codice bash e queste due righe mi sono sconcertanti:Operatore Bash al colon in sostituzione variabile?

branch_name=`git describe --contains --all HEAD` 
branch_name=${branch_name:-HEAD} 

mia comprensione dell'operatore colon : è che è crea una sottostringa in base a un indice in modo da utilizzare una stringa, -HEAD in questo caso, lo fa non ha alcun senso.

risposta

26

Questo prende la variabile branch_name, se è definita. Se non è definito, utilizzare invece HEAD.

Vedere Shell Parameter Expansion per dettagli.

Le sottostringhe sono coperte da alcune righe di seguito. La differenza tra i due è

${parameter:-word} 

vs

${parameter:offset} 
${parameter:offset:length} 
+0

Ottima risposta. Grazie per il link Olaf. Questo ha chiarito tutto per me. –

+0

E se c'è solo ': -'? Vendo "$ {RDAUTH: -}" – willemdh

+0

Funziona come una stringa vuota, tt fornisce il contenuto di 'RDAUTH' o una stringa vuota. –

6

In bash, ${VAR1:-VAR2} è equivalente a SQL di coalesce(VAR1, VAR2), o C# 's VAR1 ?? VAR2.

Nel caso:

branch_name=`git describe --contains --all HEAD` 
branch_name=${branch_name:-HEAD} 

La prima riga esegue il comando git e imposta il valore della variabile branch_name, poi, la seconda linea fonde suo valore assegnando il valore di HEAD se branch_name è nullo.

Come detto ${VAR1:NUM} è un'operazione prefisso stringa (left in SQL), che quando viene utilizzato con un numero negativo, come ${VAR1: -NUMBER} diventa un suffisso (right) operazione. Nota lo spazio bianco prima del segno meno: se salti quello spazio vuoto diventa l'operazione coalesce come ho detto prima.

12

In questo caso, il colon è solo un modificatore per l'operatore -. ${branch-HEAD} si espanderebbe su "HEAD" solo se branch non è impostato, mentre ${branch:-HEAD} si espande in "HEAD" se branch è anche la stringa nulla.

$ branch=master 
$ echo "${branch-HEAD} + ${branch:-HEAD}" 
master + master 
$ branch="" 
$ echo "${branch-HEAD} + ${branch:-HEAD}" 
+ HEAD 
$ unset branch 
$ echo "${branch-HEAD} + ${branch:-HEAD}" 
HEAD + HEAD