Question Comment vérifier si une variable est définie dans Bash?


Comment savoir si une variable est définie dans Bash?

Par exemple, comment vérifier si l'utilisateur a donné le premier paramètre à une fonction?

function a {
    # if $1 is set ?
}

1067
2017-08-30 14:54


origine


Réponses:


(Habituellement) La bonne façon

if [ -z ${var+x} ]; then echo "var is unset"; else echo "var is set to '$var'"; fi

${var+x} est un expansion de paramètre qui évalue à rien si var n'est pas défini et remplace la chaîne x autrement.

Citations Digression

Les citations peuvent être omises (nous pouvons donc dire ${var+x} au lieu de "${var+x}") parce que cette syntaxe et cette utilisation garantissent que cela ne s'étendra qu'à quelque chose qui ne nécessite pas de guillemets (puisqu'il s'étend à x (qui ne contient aucun mot, donc il n'a pas besoin de guillemets), ou à rien (ce qui entraîne [ -z ], qui évalue commodément à la même valeur (vrai) que [ -z "" ] fait aussi bien)).

Cependant, alors que les citations peuvent être omises en toute sécurité, et cela n'était pas immédiatement évident pour tous (il n'était même pas évident le premier auteur de cette explication des citations qui est aussi un important codeur Bash), il serait parfois préférable d'écrire la solution avec des guillemets [ -z "${var+x}" ], au très faible coût possible d'une pénalité de vitesse O (1). Le premier auteur a également ajouté ceci comme un commentaire à côté du code en utilisant cette solution donnant l'URL de cette réponse, qui inclut maintenant aussi l'explication de la raison pour laquelle les citations peuvent être omises en toute sécurité.

(Souvent) Le mauvais chemin

if [ -z "$var" ]; then echo "var is blank"; else echo "var is set to '$var'"; fi

Cela est souvent faux car il ne fait pas de distinction entre une variable qui n'est pas définie et une variable définie sur la chaîne vide. C'est-à-dire, si var='', alors la solution ci-dessus affichera "var is blank".

La distinction entre unset et "set to the empty string" est essentielle dans les situations où l'utilisateur doit spécifier une extension, ou une liste supplémentaire de propriétés, et que ne pas les spécifier par défaut à une valeur non vide, alors que la spécification de la chaîne vide devrait faites en sorte que le script utilise une extension vide ou une liste de propriétés supplémentaires.

La distinction peut ne pas être essentielle dans tous les cas. Dans ces cas [ -z "$var" ] ça ira très bien.


1596
2017-12-13 17:04



Pour vérifier la variable de chaîne non nulle / non nulle, c'est-à-dire, si elle est définie, utilisez

if [ -n "$1" ]

C'est le contraire de -z. Je me trouve en utilisant -n plus que -z.


650
2017-08-30 15:17



Voici comment tester si un paramètre est désactivé, ou vide ("Null") ou définir avec une valeur:

+--------------------+----------------------+-----------------+-----------------+
|                    |       parameter      |     parameter   |    parameter    |
|                    |   Set and Not Null   |   Set But Null  |      Unset      |
+--------------------+----------------------+-----------------+-----------------+
| ${parameter:-word} | substitute parameter | substitute word | substitute word |
| ${parameter-word}  | substitute parameter | substitute null | substitute word |
| ${parameter:=word} | substitute parameter | assign word     | assign word     |
| ${parameter=word}  | substitute parameter | substitute null | assign word     |
| ${parameter:?word} | substitute parameter | error, exit     | error, exit     |
| ${parameter?word}  | substitute parameter | substitute null | error, exit     |
| ${parameter:+word} | substitute word      | substitute null | substitute null |
| ${parameter+word}  | substitute word      | substitute word | substitute null |
+--------------------+----------------------+-----------------+-----------------+

La source: POSIX: extension de paramètre:

Dans tous les cas représentés par "substitut", l'expression est remplacée par la valeur affichée. Dans tous les cas affichés avec "assign", le paramètre est affecté à cette valeur, qui remplace également l'expression.


389
2018-05-25 20:20



Il y a plusieurs façons de le faire, l'une d'entre elles étant la suivante:

if [ -z "$1" ]

Cela réussit si $ 1 est nul ou non défini


168
2017-08-30 15:00



Alors que la plupart des techniques indiquées ici sont correctes, bash 4.2 supporte un test réel de présence d'une variable (homme bash), plutôt que de tester la valeur de la variable.

[[ -v foo ]]; echo $?
# 1

foo=bar
[[ -v foo ]]; echo $?
# 0

foo=""
[[ -v foo ]]; echo $?
# 0

145
2017-07-09 02:28



Pour voir si une variable est non vide, j'utilise

if [[ $var ]]; then ...       # `$var' expands to a nonempty string

Les tests opposés si une variable est non définie ou vide:

if [[ ! $var ]]; then ...     # `$var' expands to the empty string (set or not)

Pour voir si une variable est définie (vide ou non vide), j'utilise

if [[ ${var+x} ]]; then ...   # `var' exists (empty or nonempty)
if [[ ${1+x} ]]; then ...     # Parameter 1 exists (empty or nonempty)

Les tests opposés si une variable n'est pas définie:

if [[ ! ${var+x} ]]; then ... # `var' is not set at all
if [[ ! ${1+x} ]]; then ...   # We were called with no arguments

54
2018-05-08 08:32



Je trouve toujours la table POSIX dans le autre réponse lent à grok, alors voici mon point de vue:

   +----------------------+------------+-----------------------+-----------------------+
   |   if VARIABLE is:    |    set     |         empty         |        unset          |
   +----------------------+------------+-----------------------+-----------------------+
 - |  ${VARIABLE-default} | $VARIABLE  |          ""           |       "default"       |
 = |  ${VARIABLE=default} | $VARIABLE  |          ""           | $(VARIABLE="default") |
 ? |  ${VARIABLE?default} | $VARIABLE  |          ""           |       exit 127        |
 + |  ${VARIABLE+default} | "default"  |       "default"       |          ""           |
   +----------------------+------------+-----------------------+-----------------------+
:- | ${VARIABLE:-default} | $VARIABLE  |       "default"       |       "default"       |
:= | ${VARIABLE:=default} | $VARIABLE  | $(VARIABLE="default") | $(VARIABLE="default") |
:? | ${VARIABLE:?default} | $VARIABLE  |       exit 127        |       exit 127        |
:+ | ${VARIABLE:+default} | "default"  |          ""           |          ""           |
   +----------------------+------------+-----------------------+-----------------------+

Notez que chaque groupe (avec et sans deux points) a le même ensemble et désactivé cas, la seule chose qui diffère est de savoir comment le vide les cas sont traités.

Avec le côlon précédent, le vide et désactivé les cas sont identiques, donc je les utiliserais si possible (c'est-à-dire :=, pas seulement =, parce que le cas vide est incohérent).

Rubriques:

  • ensemble veux dire VARIABLE est non vide (VARIABLE="something")
  • vide veux dire VARIABLE est vide / nul (VARIABLE="")
  • désactivé veux dire VARIABLE n'existe pas (unset VARIABLE)

Valeurs:

  • $VARIABLE signifie que le résultat est la valeur d'origine de la variable.
  • "default" signifie que le résultat était la chaîne de remplacement fournie.
  • "" signifie que le résultat est null (une chaîne vide).
  • exit 127 signifie que le script cesse d'être exécuté avec le code de sortie 127.
  • $(VARIABLE="default") signifie que le résultat est la valeur d'origine de la variable et la chaîne de remplacement fournie est affectée à la variable pour une utilisation future.

30
2018-06-17 15:19