Comment gérer l'expansion des variables de bash vides ou non.
Objectif
L'objet de ce didacticiel est d'apprendre à modifier le comportement de bash lors de l'expansion des variables non set ou vides en utilisant une syntaxe dédiée.
Exigences
- Aucun privilège de système spécial n'est nécessaire pour suivre ce tutoriel
Présentation
L'expansion des variables est l'une des caractéristiques les plus courantes utilisées dans le shell: lorsqu'une variable existe et fait partie d'une commande, elle est «étendue», de sorte que cela est remplacé par sa valeur. L'expansion des variables vides, est l'une de ces choses, qui, si elle n'est pas bien gérée, pourrait causer de graves dommages à un système: imaginez une commande comme celle-ci:
$ sudo rm -rf "/${dir}"Dans un cas comme celui-ci, si la variable & # 36 {dir} est vide ou non, son expansion ne produirait aucune valeur, donc la commande exécutée réelle serait:
$ sudo rm -rf /Notre système serait condamné . Traiter, ou mieux empêcher une situation comme celle-ci, c'est d'une importance vitale. Dans ce tutoriel, nous verrons comment gérer l'expansion des variables vides en utilisant une syntaxe spécifique à bash.
Utilisez une valeur par défaut si une variable est vide ou non
Le premier cas que nous prenons en compte est lorsqu'une variable non set ou vide est référencée dans une extension et que nous voulons utiliser une valeur de secours/par défaut à sa place. Supposons que nous faisons référence à la variable non existante $couleur dans le cadre de la commande suivante:
$ echo "the sky is $color"
Le résultat de cette commande serait:
the sky isComme prévu, comme la variable n'est pas définie, rien ne résulte de son expansion, nous laissant avec une phrase inachevée (et un ciel sans couleur). Pas de mal de mal dans ce cas, bien sûr, mais comment pourrions-nous demander au shell d'utiliser une valeur par défaut dans un cas comme celui-ci?
Il existe une syntaxe spécialement conçue pour obtenir ce comportement, et c'est très simple:
${parameter:-word}Voici comment cela fonctionne:
$ echo "the sky is ${color:-"blue"}"
the sky is blue
Lorsque vous utilisez cette syntaxe, si paramètre n'existe pas ou est vide, l'extension entraînera la valeur de word . Dans ce cas, la variable $couleur n'a pas été définie, donc le shell a utilisé «bleu» à la suite de l'expansion.
Il convient de remarquer que même si l'expansion a abouti à la valeur spécifiée comme «par défaut», avec cette syntaxe, après l'expansion, la variable $colore sera toujours non et non définie:
$ echo "$color"
Utiliser et également attribuer une nouvelle valeur si une variable est vide ou non
La commande ci-dessus n'a renvoyé aucune sortie, car la variable, à ce stade, n'était toujours pas définie. Que se passe-t-il si nous voulons utiliser une valeur spécifiée lors de l'expansion d'une variable non set ou vide, mais attribuez également cette valeur à la variable après l'expansion? Une syntaxe légèrement différente nous a permis de réaliser ce que nous voulons:
${parameter:=word}Voyons un exemple dans lequel cette syntaxe est utilisée:
$ echo "the sky is ${color:="blue"}"
the sky is blue
Tout comme cela s'est produit précédemment, word a été utilisé dans l'expansion, car le paramètre (la variable $colore ) n' a pas été défini. De plus, word , («bleu» dans ce cas), a également été attribué comme valeur à la variable précédemment non définie. La vérification est très facile:
$ "the sky is $color"
the sky is blue
Voir? L'expansion de la variable $couleur se traduit désormais en «bleu».
Utilisez une autre valeur si une variable est définie
Une syntaxe légèrement différente nous a permis d'obtenir un résultat encore différent, ici, c'est:
{parameter:+word}Comment modifie-t-il le comportement du shell? Lorsque cette syntaxe, elle est utilisée, si le paramètre est vide ou non, word sera pas sera utilisé, donc l'expansion sera vide. Si, à la place, la variable a une valeur, le résultat de l'extension sera word , et la valeur du paramètre ne sera pas modifiée. Clarifions cela avec quelques exemples:
Premier cas. La variable $couleur n'est pas définie, donc le résultat de l'expansion ne sera rien:
$ echo "the sky is ${color:+"blue"}"
the sky is
Deuxième cas. La variable $couleur a une valeur: l'extension entraînera la valeur spécifiée à droite de : + , mais la valeur de la couleur $colori > La variable ne sera pas modifiée:
# Assign a value to the "color" variablecolor="red"
Since the variable is set, the result of the expansion will be "blue"echo "the sky is ${color:+"blue"}"
the sky is blue
The value of the "color" variable has not been changedecho "$color"
red
Afficher un message d'erreur si une variable est vide ou non
Le dernier type de syntaxe que nous examinerons ici est:
${parameter:?word}Lorsque vous utilisez cette syntaxe, si le paramètre n'est pas défini ou vide, le script quittera avec une erreur. De plus, word sera envoyé à stderr (erreur standard). Pour le bien de cet exemple, considérez la variable «couleur» comme non comme avant:
# The message we specified is displayed to standard errorecho "the sky is ${color:?"color not set"}"
bash: color: color not set
La commande est sortie avec l'erreur et le message ne pas définir le message a été affiché. Dans le cas où la variable a été définie, le résultat de l'expansion serait sa propre valeur:
$ color="blue"echo "the sky is ${color:?"color not set"}"
the sky is blue