1068 votes

Comment déterminer si une variable de bash est vide?

Quelle est la meilleure façon de déterminer si une variable en bash est vide ("")?

J'ai entendu dire qu'il est recommandé de faire if [ "x$variable" = "x" ]

Est-ce la bonne méthode? (il doit y avoir quelque chose de plus direct)

1 votes

3 votes

En Bash, [[ -v VAR]] est utilisé pour vérifier si VAR est défini, [[ -z $VAR ]] est utilisé pour vérifier si "$VAR" est étendu à une chaîne vide (""). Ainsi, vous pouvez utiliser [[ -v VAR && -z $VAR ]]. En savoir plus ici (avec une référence officielle)

0 votes

11voto

errant.info Points 199

Une alternative que j'ai vue à [ -z "$foo" ] est la suivante, cependant je ne suis pas sûr pourquoi les gens utilisent cette méthode, quelqu'un sait?

[ "x${foo}" = "x" ]

De toute façon, si vous interdisez les variables non définies (soit par set -u ou set -o nounset), alors vous rencontrerez des problèmes avec ces deux méthodes. Il y a une solution simple à cela:

[ -z "${foo:-}" ]

Remarque: cela laissera votre variable non définie.

5 votes

Il y a un commentaire sur l'alternative à -z à l'adresse pubs.opengroup.org/onlinepubs/009695399/utilities/test.html. Fondamentalement, ce n'est pas censé être une alternative à -z. Au contraire, cela gère les cas où $foo pourrait se développer en quelque chose commençant par un métacaractère que [ ou test serait confus par. Mettre un non-métacaractère arbitraire au début élimine cette possibilité.

7voto

Le if-then et -z entier sont inutiles.

\[ "$foo" \] && echo "foo n'est pas vide"
\[ "$foo" \] || echo "foo est effectivement vide"

5 votes

Cela va échouer si foo contient uniquement des espaces

4 votes

Échouera également dans certaines consoles si foo commence par un tiret car il est interprété comme une option. Par exemple, sur Solaris ksh, zsh et bash ne posent pas de problème, sh et /bin/test échoueront

6voto

Luca Borrione Points 705

La question demande comment vérifier si une variable est une chaîne vide et les meilleures réponses sont déjà données pour cela.
Mais je suis arrivé ici après une longue période de programmation en php et ce que je cherchais en réalité était une vérification comme la fonction empty en php qui fonctionne dans un shell bash.
Après avoir lu les réponses, j'ai réalisé que je ne pensais pas correctement en bash, mais de toute façon, à ce moment-là, une fonction comme empty en php aurait été tellement pratique dans mon code bash.
Comme je pense que cela peut arriver à d'autres, j'ai décidé de convertir la fonction empty php en bash

Selon le manuel de php:
une variable est considérée comme vide si elle n'existe pas ou si sa valeur est l'une des suivantes:

  • "" (une chaîne vide)
  • 0 (0 en tant qu'entier)
  • 0.0 (0 en tant que flottant)
  • "0" (0 en tant que chaîne)
  • un tableau vide
  • une variable déclarée, mais sans valeur

Évidemment les cas null et false ne peuvent pas être convertis en bash, donc ils sont omis.

function empty
{
    local var="$1"

    # Renvoie vrai si :
    # 1.    var est une chaîne nulle ("" comme chaîne vide)
    # 2.    une variable non définie est passée
    # 3.    une variable ou un tableau déclaré mais sans valeur est passé
    # 4.    un tableau vide est passé
    if test -z "$var"
    then
        [[ $( echo "1" ) ]]
        return

    # Renvoie vrai si var est zéro (0 en tant qu'entier ou "0" en tant que chaîne)
    elif [ "$var" == 0 2> /dev/null ]
    then
        [[ $( echo "1" ) ]]
        return

    # Renvoie vrai si var est 0.0 (0 en tant que flottant)
    elif [ "$var" == 0.0 2> /dev/null ]
    then
        [[ $( echo "1" ) ]]
        return
    fi

    [[ $( echo "" ) ]]
}

Exemple d'utilisation:

if empty "${var}"
    then
        echo "vide"
    else
        echo "non vide"
fi

Démo :
le snippet suivant:

#!/bin/bash

vars=(
    ""
    0
    0.0
    "0"
    1
    "chaîne"
    " "
)

for (( i=0; i<${#vars[@]}; i++ ))
do
    var="${vars[$i]}"

    if empty "${var}"
        then
            what="vide"
        else
            what="non vide"
    fi
    echo "VAR \"$var\" est $what"
done

exit

donne en sortie :

VAR "" est vide
VAR "0" est vide
VAR "0.0" est vide
VAR "0" est vide
VAR "1" n'est pas vide
VAR "chaîne" n'est pas vide
VAR " " n'est pas vide

Cela dit, dans une logique bash, les vérifications sur zéro dans cette fonction peuvent causer des problèmes secondaires à mon avis, toute personne utilisant cette fonction devrait évaluer ce risque et peut-être décider de supprimer ces vérifications pour ne laisser que la première.

1 votes

À l'intérieur de la fonction empty - pourquoi avez-vous écrit [[ $( echo "1" ) ]] ; return plutôt que simplement return 1 ?

5voto

Fedir RYKHTIK Points 577

Personnellement, je préfère une façon plus claire de vérifier :

if [ "${VARIABLE}" == "" ]; then
  echo VARIABLE est vide
else
  echo VARIABLE n'est pas vide
fi

1 votes

Certaines coquilles n'acceptent pas le double signe égal.

1 votes

La question portait sur bash. Je suis en train d'utiliser bash. Ça marche bien pour moi. De quoi exactement parles-tu ?

3 votes

Si vous utilisez Bash, vous devriez utiliser des doubles crochets. Mon commentaire précédent était une simple déclaration de fait pour ceux qui pourraient lire votre réponse et utiliser un shell différent.

4voto

Ceci est vrai exactement lorsque $FOO est défini et vide :

[ "${FOO+x}" = x ] && [ -z "$FOO" ]

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X