web-dev-qa-db-fra.com

coquille de poisson. Comment vérifier si une variable est définie / vide?

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?

23
Adam Zahran
  • 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 sets 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.

34
faho