string - management - ¿Operador de colon Bash en sustitución variable?
bash variable substitution (3)
En bash, ${VAR1:-VAR2}
es equivalente a la coalesce(VAR1, VAR2)
de SQL coalesce(VAR1, VAR2)
, o VAR1 ?? VAR2
C # VAR1 ?? VAR2
VAR1 ?? VAR2
.
En tu caso:
branch_name=`git describe --contains --all HEAD`
branch_name=${branch_name:-HEAD}
La primera línea ejecuta el comando git
y establece el valor en la variable branch_name
, luego, la segunda línea se fusiona en su valor asignando el valor de HEAD
si branch_name
es nulo.
Como dijo, ${VAR1:NUM}
es una operación de prefijo de cadena (a la left
en SQL), que cuando se utiliza con un número negativo, como ${VAR1: -NUMBER}
convierte en una operación de sufijo ( right
). Tenga en cuenta el espacio en blanco antes del signo menos: si omite ese espacio en blanco, se convierte en la operación de coalesce
como he dicho antes.
Heredé algo de código bash y estas dos líneas me están desconcertando:
branch_name=`git describe --contains --all HEAD`
branch_name=${branch_name:-HEAD}
Mi comprensión del operador :
dos puntos es que crea una subcadena basada en un índice, por lo que usar una cadena, -HEAD
en este caso, no tiene ningún sentido.
En este caso, los dos puntos son solo un modificador para el operador -
. ${branch-HEAD}
se expandiría a "HEAD" solo si la branch
está establecida, mientras que ${branch:-HEAD}
expande a "HEAD" si la branch
es la cadena nula.
$ 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
Esto toma la variable branch_name
, si está definida. Si no está definido, use HEAD
lugar.
Vea Shell Expansión de parámetros para más detalles.
Las subcadenas están cubiertas unas líneas más abajo. La diferencia entre los dos es
${parameter:-word}
vs
${parameter:offset}
${parameter:offset:length}