Christophe C a écritJe vais retester avec -n.
Edit : non je te garantie que je n'ai pas le même résultat avec [ ! -z $var ] et [ -n $var ]. Dans mon test, le 1er fonctionne, pas le second. Le problème vient du fait que la variable peut être vide, pleine ou inexistante.
Comme je te suggérais en #18, tu n'as pas mis les guillemets autour de ta variable.
Dès lors, tu n'opères pas un test sur la variable, mais uniquement sur les chaines
-z ou
-n.
Pour t'en convaincre, tu peux activer le traçage des commandes, par
set -x :
$ unset var
$ set -x
$ [ -n $var ]
+ '[' -n ']'
$ [ -n ]
+ '[' -n ']'
$ [ -n "$var" ]
+ '[' -n '' ']'
$
Comme les chaines
-z et
-n sont non vides, les crochets
[…] te renvoient 0 :
$ [ chaine-non-vide ]
$ echo $?
0
$
Si maintenant tu rajoutes un opérateur de négation
!, ça va simplement inverser le résultat du test :
$ [ ! chaine-non-vide ]
$ echo $?
1
$
C'est pour ça que
[ -n $var ] te renvoie 0, alors que tu t'attends à 1 : le test ne te dit pas que
$var est non vide, mais que la chaine
-n est non vide.
De même,
[ -z $var ] ne te dit pas
$var est vide, mais que la chaine
-z est non vide.
Et
[ ! -z $var ] ne te dit pas qu'il est faux que
$var est non vide, mais qu'il est faux que la chaine
-z est vide.
En conclusion, si tu dois retenir une chose : protège tes variables avec des guillemets, sauf si tu sais
vraiment pourquoi tu ne le fais pas.
Christophe C a écritPour let, mon objectif est de tester si une variable est numérique. Concrètement, quand Let sur un variable me renvoi $? = 0, c'est que la variable est une chaine numérique. si $? = 1, c'est alpha
Dès lors, je ne suis pas sur de comprendre ta remarque "let renvoie 1 si son dernier argument est évalué à 0". C'est quoi le dernier argument : la variable ? Et c'est évalué à 0 si c'est alpha ?
Non.
let ne renvoie pas forcément 0 si une chaine est numérique.
Exemple :
$ let 0
$ echo $?
1
$
let renvoie 0 si son dernier argument n'est pas évalué à 0.
Exemple :
$ let 0+0 1+1
$ echo $?
0
$ let 1+1 0+0
$ echo $?
1
$
let renvoie 1 quand on lui passe une expression non arithmétique, car cette expression est évaluée à 0.
Concernant les tests à réaliser directement sur la commande plutôt que sur la variable spéciale
$?, je te renvoie vers shellcheck :
https://github.com/koalaman/shellcheck/wiki/SC2181#rationale