J'écris actuellement un cadre de test bash, dans lequel dans une fonction de test, les tests bash standard ( [[
) ainsi que les matchers prédéfinis peuvent être utilisés. Les correspondants sont des wrappers pour «[[» et en plus de renvoyer un code de retour, ils définissent un message significatif indiquant ce qui était attendu.
Exemple:
string_equals() {
if [[ ! $1 = $2 ]]; then
error_message="Expected '$1' to be '$2'."
return 1
fi
}
Ainsi, lorsqu'un matcher est utilisé et qu'il échoue, alors seulement un message_erreur est défini.
Maintenant, à un moment donné plus tard, je teste si les tests ont réussi. S'il réussit, j'imprime l'attente en vert, si elle a échoué en rouge.
De plus, il peut y avoir un ensemble error_message, donc je teste si un message existe, je l'imprime, puis je le désactive (car le test suivant peut ne pas définir un 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 simplement de la définir sur ``, comme
error_message=''
Quel est le meilleur? Cela fait-il réellement une différence? Ou peut-être devrais-je avoir un indicateur supplémentaire indiquant que le message a été défini?
error_message
avec rien d'autre, je dirais que cela n'a pas d'importance. Cependant, je pense que vous voulez[[ $error_message ]]
, sinon vous testez que la chaîne littérale "message_erreur" existe.Réponses:
La plupart du temps, vous ne voyez pas de différence, sauf si vous utilisez
set -u
:Donc, vraiment, cela dépend de la façon dont vous allez tester la variable.
J'ajouterai que ma manière préférée de tester si elle est définie est:
ou
la source
var=
n'est pas "non défini". C'est juste une chaîne vide sans guillemets. En plus deset -u
, les diverses formes d'expansion des paramètres de bash peuvent également faire la distinction entre les valeurs non définies et nulles: se${foo:bar}
développe en "bar" quandfoo
est non défini, mais "" quandfoo
est nul, tandis que se${foo:-bar}
développe en "bar" si foo est non défini ou nul.[[ -n $var ]]
est faux sivar
est défini sur la chaîne vide.${foo-bar}
au lieu de${foo:bar}
. test par vous-même:unset a; echo ">${a:-foo}-${a:foo}-${a-foo}<"
Comme cela a été dit, utiliser unset est également différent avec les tableaux
la source
Ainsi, en désactivant l'index du tableau 2, vous supprimez essentiellement cet élément du tableau et décrémentez la taille du tableau (?).
J'ai fait mon propre test.
Ce qui aboutit à ..
Donc, juste pour clarifier que la désactivation du tableau entier le supprimera en fait entièrement.
la source
Sur la base des commentaires ci-dessus, voici un test simple:
Exemple:
la source