J'ai consulté quelques scripts écrits par d'autres personnes (en particulier Red Hat), et bon nombre de leurs variables sont affectées à l'aide de la notation suivante
VARIABLE1="${VARIABLE1:-some_val}"
ou développent d'autres variables.
VARIABLE2="${VARIABLE2:-`echo $VARIABLE1`}"
Quel est l'intérêt d'utiliser cette notation au lieu de simplement déclarer les valeurs directement (par exemple, VARIABLE1=some_val
)?
Y at-il des avantages à cette notation ou des erreurs possibles qui pourraient être évitées?
Le a-t- :-
il une signification spécifique dans ce contexte?
bash
shell-script
scripting
variable
Rothgar
la source
la source
man bash
; recherchez le bloc "Parameter Expansion" (environ 28%). Ces assignations sont par exemple des fonctions par défaut: "Utilisez la valeur par défaut uniquement si aucune n'a encore été définie."Réponses:
Cette technique permet d'attribuer une valeur à une variable si une autre variable est vide ou non définie. Remarque: cette "autre variable" peut être la même ou une autre variable.
extrait
REMARQUE: Ce formulaire fonctionne également
${parameter-word}
. Si vous souhaitez voir une liste complète de toutes les formes d'expansion de paramètres disponibles dans Bash, je vous suggère vivement de jeter un coup d'œil à cette rubrique dans le wiki de Bash Hacker intitulé " Expansion des paramètres ".Exemples
la variable n'existe pas la variable existeLa même chose peut être faite en évaluant d'autres variables ou en exécutant des commandes dans la partie valeur par défaut de la notation.
Plus d'exemples
Vous pouvez également utiliser une notation légèrement différente là où c'est juste
VARX=${VARX-<def. value>}
.Dans ce qui précède
$VAR1
et$VAR2
déjà défini par la chaîne « a une autre valeur » , mais$VAR3
était définie, la valeur par défaut a été utilisé à la place,0
.Un autre exemple
Vérifier et assigner en utilisant la
:=
notationEnfin , je mentionnerai l'opérateur à portée de main,
:=
. Cela fera une vérification et assignera une valeur si la variable à tester est vide ou non définie.Exemple
Notez que
$VAR1
c'est maintenant réglé. L’opérateur a:=
fait le test et l’affectation en une seule opération.Cependant, si la valeur est définie auparavant, elle est laissée seule.
Table de référence Handy Dandy
Références
la source
bash
. Celui${var:-word}
du Q est, mais pas celui${var-word}
ci - dessus. La documentation POSIX a un joli tableau, mais il vaut peut-être la peine de la copier dans cette réponse - pubs.opengroup.org/onlinepubs/9699919799/utilities/…echo "${FOO:=default}"
est génial si vous voulez réellement leecho
. Mais si vous ne le faites pas, essayez la fonction:
intégrée ...: ${FOO:=default}
Votre$FOO
configuration est la suivantedefault
(c’est-à-dire si elle n’a pas déjà été définie). Mais il n'y a pas d'écho$FOO
dans le processus.${4:-$VAR}
travail va.@slm a déjà inclus les documents POSIX - qui sont très utiles - mais ils ne développent pas vraiment la manière dont ces paramètres peuvent être combinés pour s’affecter mutuellement. Il n'y a pas encore de mention ici de ce formulaire:
Ceci est un extrait d’ une autre de mes réponses , et je pense que cela montre très bien comment cela fonctionne:
Un autre exemple de même :
L'exemple ci - dessus profite de toutes les 4 formes de substitution de paramètres et de leurs différents POSIX
:colon null
ounot null
tests. Il y a plus d'informations dans le lien ci-dessus, et le voici à nouveau .Une autre chose à laquelle les gens ne pensent souvent pas,
${parameter:+expansion}
c'est à quel point cela peut être utile dans un document ici. Voici un autre extrait d'une réponse différente :HAUT
Ici, vous définissez des valeurs par défaut et vous préparez à les imprimer lorsque vous êtes appelé ...
MILIEU
C'est ici que vous définissez d'autres fonctions pour appeler votre fonction d'impression en fonction de leurs résultats ...
BAS
Vous avez tout configuré maintenant, alors voici où vous allez exécuter et extraire vos résultats.
RÉSULTATS
J'expliquerai pourquoi dans un instant, mais l'exécution de ce qui précède produit les résultats suivants:
COMMENT ÇA FONCTIONNE:
La caractéristique clé ici est le concept de
conditional ${parameter} expansion.
Vous pouvez définir une variable sur une valeur uniquement si elle est non définie ou nulle en utilisant le formulaire:Si, au lieu de cela, vous souhaitez définir uniquement une variable non définie, vous omettez les
:colon
valeurs et null resteraient telles quelles.SUR LA PORTÉE:
Vous remarquerez peut-être que, dans l'exemple ci-dessus
$PLACE
, les$RESULT
modifications sont apportées lorsqu'elles sont définies viaparameter expansion
même si elles_top_of_script_pr()
ont déjà été appelées, probablement en les configurant lors de leur exécution. La raison pour laquelle cela fonctionne est que_top_of_script_pr()
c'est une( subshelled )
fonction - je l'ai incluseparens
plutôt que celle{ curly braces }
utilisée pour les autres. Comme elle est appelée dans un sous-shell, toutes les variables qu'elle définit sontlocally scoped
et, à mesure qu'elles retournent dans leur shell parent, ces valeurs disparaissent.Mais lorsqu’il est
_more_important_function()
défini,$ACTION
il en va de mêmeglobally scoped
pour la_less_important_function()'s
deuxième évaluation$ACTION
car_less_important_function()
,$ACTION
uniquement via${parameter:=expansion}.
la source
Expérience personnelle.
J'utilise parfois ce format dans mes scripts pour minimiser les valeurs ad-hoc, par exemple si j'ai:
Je peux courir:
sans avoir à changer la valeur par défaut d'origine de
SOMETHING
.la source