124 votes

Utilisation de unset par rapport à la mise à vide d'une variable

J'écris actuellement un cadre de test bash, où dans une fonction de test, les deux tests bash standard ( [[ ) ainsi que des comparateurs prédéfinis peuvent être utilisés. Les concordances sont des enveloppes pour '[[' et, en plus de renvoyer un code de retour, elles fournissent un message significatif indiquant ce qui était attendu.

Ejemplo:

string_equals() {
    if [[ ! $1 = $2 ]]; then
            error_message="Expected '$1' to be '$2'."

            return 1
    fi
}

Ainsi, lorsqu'un matcheur est utilisé et qu'il échoue, c'est seulement dans ce cas qu'un error_message est défini.

Ensuite, à un moment donné, je vérifie si les tests ont réussi. S'ils ont réussi, j'imprime l'attente en vert, s'ils ont échoué, en rouge.

De plus, il se peut qu'un message d'erreur soit défini, donc je teste si un message existe, je l'imprime, puis je le supprime (parce que le test suivant peut ne pas définir de message d'erreur). error_message ) :

if [[ $error_message ]]; then
    printf '%s\n' "$error_message"

    unset -v error_message
fi

Maintenant, ma question est de savoir s'il est préférable d'annuler la variable ou de lui attribuer la valeur '', comme suit

error_message=''

Lequel est le meilleur ? Cela fait-il vraiment une différence ? Ou peut-être devrais-je avoir un drapeau supplémentaire indiquant que le message a été défini ?

155voto

cdarke Points 8020

La plupart du temps, vous ne verrez pas de différence, sauf si vous utilisez set -u :

/home/user1> var=""
/home/user1> echo $var

/home/user1> set -u
/home/user1> echo $var

/home/user1> unset var
/home/user1> echo $var
-bash: var: unbound variable

En fait, cela dépend de la manière dont vous allez tester la variable.

J'ajouterai que ma méthode préférée pour vérifier s'il est réglé est la suivante :

[[ -n $var ]]  # True if the length of $var is non-zero

o

[[ -z $var ]]  # True if zero length

19voto

Steven Penny Points 18523

Comme il a été dit, l'utilisation de unset est également différente avec les tableaux.

$ foo=(4 5 6)

$ foo[2]=

$ echo ${#foo[*]}
3

$ unset foo[2]

$ echo ${#foo[*]}
2

2voto

PdC Points 1090

Ainsi, en annulant l'indice 2 du tableau, vous supprimez essentiellement cet élément du tableau et décrémentez la taille du tableau ( ?).

J'ai fait mon propre test..

foo=(5 6 8)
echo ${#foo[*]}
unset foo
echo ${#foo[*]}

Ce qui entraîne

3
0

Donc, juste pour clarifier le fait que la désactivation de l'ensemble du tableau va en fait le supprimer entièrement.

1voto

Sh3ljohn Points 746

Sur la base des commentaires ci-dessus, voici un test simple :

isunset() { [[ "${!1}" != 'x' ]] && [[ "${!1-x}" == 'x' ]] && echo 1; }
isset()   { [ -z "$(isunset "$1")" ] && echo 1; }

Ejemplo:

$ unset foo; [[ $(isunset foo) ]] && echo "It's unset" || echo "It's set"
It's unset
$ foo=     ; [[ $(isunset foo) ]] && echo "It's unset" || echo "It's set"
It's set
$ foo=bar  ; [[ $(isunset foo) ]] && echo "It's unset" || echo "It's set"
It's set

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X