Quelle est la signification de ce style dans bash ?
${PUBLIC_INTERFACE:-eth0}
Quel est le but de :-
?
Quelle est la signification de ce style dans bash ?
${PUBLIC_INTERFACE:-eth0}
Quel est le but de :-
?
Si $PUBLIC_INTERFACE
existe et n'est pas nulle, retourne sa valeur, sinon retourne la valeur de l'objet. "eth0"
.
Il y en a en fait quelques-uns qui sont documentés dans la base de données de l'UE. page de manuel de bash :
${paramètre:-mot} Utiliser les valeurs par défaut. Si le paramètre est non défini ou nul, l'expansion du mot est substituée. Sinon, la valeur du paramètre est substituée.
${paramètre:=mot} Attribuer des valeurs par défaut. Si le paramètre est non défini ou nul, l'expansion du mot est attribuée au paramètre. La valeur du paramètre est alors substituée. Les paramètres positionnels et les paramètres spéciaux ne peuvent pas être affectés de cette manière.
${paramètre:?mot} Affiche une erreur si elle est nulle ou non définie. Si le paramètre est null ou unset, l'expansion de word (ou un message à cet effet si word n'est pas présent) est écrite dans l'erreur standard et le shell, s'il n'est pas interactif, sort. Sinon, la valeur du paramètre est substituée.
${paramètre:+mot} Utiliser une autre valeur. Si le paramètre est nul ou non défini, rien n'est substitué, sinon l'expansion du mot est substituée.
:-
est utilisé dans le ${_parameter_:-_word_}
expansion des paramètres de l'enveloppe : si parameter
est nulle ou non définie, elle est étendue à la valeur de l'élément word
sinon à la valeur de parameter
.
Exemple :
$ str=
$ echo "${str:-default}"
default
Ceci et les expansions similaires utilisant :=
, :+
y :?
existent en deux versions : avec et sans deux-points. La différence est que l'expansion avec les deux-points interviennent pour "unset ou nul ", alors que sans le deux-points, c'est juste "unset".
Observez :
$ str= # Null, but not unset
$ echo "${str-default}" # Expands to value of $str, the empty string
$ echo "${str:-default}" # Expands to "default"
default
En quoi est-ce utile ? Quelques exemples :
Valeurs par défaut
L'éditeur invoqué pour modifier la dernière commande avec fc
est le résultat de l'expansion ${FCEDIT:-${EDITOR:-vi}}
: $FCEDIT
si elle est définie et non nulle, ou sinon $EDITOR
si elle est définie et non nulle, ou sinon vi
.
Une boucle dans un script qui doit lire à partir d'un fichier si celui-ci est fourni comme argument et à partir de l'entrée standard sinon pourrait ressembler à ceci :
while IFS= read -r line; do
# do something
done < "${1:-/dev/stdin}"
Lorsque vous utilisez set -u
set -u
est un moyen pratique de forcer un script plus propre en faisant mourir le script lorsqu'il rencontre une variable non définie, comme le préconise par exemple cet article (non pas que j'approuve tout ce qui s'y trouve). 1 ). Si nous voulons vérifier si une certaine variable a une valeur avec [[ $var ]]
le script meurt maintenant si var
n'est pas défini, même si cela peut être légitime.
La façon de contourner ce problème est d'utiliser [[ ${var:-} ]]
à la place, et set -u
ne se plaindra pas. (Cela revient à utiliser à nouveau une valeur par défaut, mais la valeur substituée est la chaîne vide dans ce cas. 2 )
Ces extensions ne sont pas exclusives à Bash, d'ailleurs : la Spécification de l'interpréteur de commandes POSIX les a tous, aussi.
1 Voir aussi BashFAQ/112, Quels sont les avantages et les inconvénients de l'utilisation de set -u
(o set -o nounset
) ?
2 Juste ${var-}
au lieu de ${var:-}
serait en fait suffisant : set -u
ne se soucie pas des variables qui ont été définies mais qui contiennent la chaîne vide ; seules les variables non définies déclenchent une erreur.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.