web-dev-qa-db-fra.com

Opérateur Bash Colon dans la substitution de variables?

J'ai hérité du code bash et ces deux lignes me déroutent:

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

Ma compréhension du : L'opérateur deux-points crée une sous-chaîne basée sur un index, donc en utilisant une chaîne, -HEAD dans ce cas, n'a aucun sens.

28
Gardner Bickford

Cela prend la variable branch_name, s'il est défini. S'il n'est pas défini, utilisez plutôt HEAD.

Voir Expansion des paramètres du shell pour plus de détails:

3.5.3 Extension des paramètres du shell

Le caractère ‘$’ introduit une expansion de paramètre, une substitution de commande ou une expansion arithmétique. ... La forme de base de l'expansion des paramètres est $ {paramètre}.
...
. L'omission des deux points entraîne un test uniquement pour un paramètre non défini. Autrement dit, si le signe deux-points est inclus, l'opérateur teste l'existence des deux paramètres et leur valeur n'est pas nulle; si le deux-points est omis, l'opérateur ne teste que l'existence.

$ {paramètre: -Word}

Si le paramètre est non défini ou nul, l'expansion de Word est substituée. Sinon, la valeur de parameter est substituée.


Les sous-chaînes sont couvertes quelques lignes ci-dessous. La différence entre les deux est

${parameter:-Word}

contre

${parameter:offset}
${parameter:offset:length}

$ {paramètre: offset}
$ {paramètre: offset: longueur}

C'est ce que l'on appelle l'extension de sous-chaîne. Il se développe jusqu'à la longueur des caractères de la valeur du paramètre en commençant par le caractère spécifié par décalage.
...
Si le décalage est évalué à un nombre inférieur à zéro, la valeur est utilisée comme décalage en caractères à partir de la fin de la valeur du paramètre. ... Notez qu'un décalage négatif doit être séparé des deux points par au moins un espace pour éviter d'être confondu avec l'expansion ‘: -’.

34
Olaf Dietsche

Dans ce cas, les deux points sont juste un modificateur pour le - opérateur. ${branch-HEAD} ne serait étendu à "HEAD" que si branch n'est pas défini, tandis que ${branch:-HEAD} se développe en "HEAD" si branch est également la chaîne nulle.

$ 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
15
chepner

En bash, ${VAR1:-VAR2} Est équivalent à la coalesce(VAR1, VAR2) de SQL, ou au VAR1 ?? VAR2 De C #.

Dans ton cas:

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

La première ligne exécute la commande git et définit la valeur dans la variable branch_name, Puis la deuxième ligne fusionne sa valeur en affectant la valeur de HEAD si branch_name est nul.

Comme vous l'avez dit, ${VAR1:NUM} Est une opération de préfixe de chaîne (left en SQL) qui, lorsqu'elle est utilisée avec un nombre négatif, car ${VAR1: -NUMBER} Devient un suffixe (right ) opération. Notez l'espace avant le signe moins: si vous sautez cet espace, cela devient l'opération coalesce comme je l'ai déjà dit.

6
ruizpauker