Comment puis-je faire quelque chose comme
set variable (some_command_that_may_return_a_string)
if [ variable is set ]
do_something
et inversement comment vérifier si la variable est vide?
set -q var
(notez le "$" manquant - ceci utilise la variable nom) peut être utilisé pour vérifier si une variable a été définie.
set -q var[1]
peut être utilisé pour vérifier si le premier élément d'une variable a été attribué (c'est-à-dire s'il n'est pas vide en tant que liste).
test -n "$var"
[fn0] (ou [ -n "$var" ]
) peut être utilisé pour vérifier si une variable se développe en une chaîne non vide (et test -z
est l'inverse - vrai s'il est vide).
Ce sera vrai/faux dans des circonstances légèrement différentes.
Quand non set var
a été effectuée (et n'a pas été héritée du processus parent), set -q var
, set -q var[1]
et test -n "$var"
sera faux, test -z "$var"
sera vrai.
Quand quelque chose comme set var
a été fait (sans argument supplémentaire), set -q var
sera vrai, set -q var[1]
sera faux.
Quand quelque chose comme set var ""
a été fait, les deux versions de set
seront vraies.
Quand quelque chose comme set var "somestring"
(ou même set var "" ""
[fn1]) a été fait, les set
s seront vrais et test -z "$var"
sera faux.
[fn0]: Vous jamais voulez utiliser test
(ou [
) sans citer la variable. Un exemple particulièrement flagrant est que test -n $var
renverra true à la fois si la variable contient quelque chose et si elle est vide dans la liste/non définie (pas de set
du tout ou set var
sans arguments). Cela est dû au fait que test
de fish est l'une des rares parties qui suivent POSIX, et qui exige que test
avec un seul argument soit vrai. De plus, il ne gère pas correctement les listes - test -n $var
aura des résultats étranges si var a plus d'un élément.
[fn1]: En effet, une liste sera développée sous forme de chaîne en joignant les éléments avec des espaces, de sorte que la liste composée de deux chaînes vides se développera à "" - un espace. Puisque ce n'est pas vide, test -z
renvoie false.