Pourquoi sont-bash -n et -z test opérateurs de pas inverses pour $@
function wtf() {
echo "$*='$*'"
echo "$@='$@'"
echo "$@='"$@"'"
echo "$@='""$@""'"
if [ -n "$*" ]; then echo " [ -n $* ]"; else echo "![ -n $* ]"; fi
if [ -z "$*" ]; then echo " [ -z $* ]"; else echo "![ -z $* ]"; fi
if [ -n "$@" ]; then echo " [ -n $@ ]"; else echo "![ -n $@ ]"; fi
if [ -z "$@" ]; then echo " [ -z $@ ]"; else echo "![ -z $@ ]"; fi
}
wtf
produit
$*='' $@='' $@='' $@='' ![ -n $* ] [ -z $* ] [ -n $@ ] [ -z $@ ]
mais il me semble que [-n $@]
doit être fausse parce que 7.3 Autres Opérateurs De Comparaison indique que [ -n "$X" ]
devrait être l'inverse de [ -z "$X" ]
pour tous $X
.
-z
chaîne est nulle, ce qui est, a une longueur de zéro
String='' # Zero-length ("null") string variable. if [ -z "$String" ] then echo "$String is null." else echo "$String is NOT null." fi # $String is null.
-n
chaîne n'est pas null.
La
-n
test nécessite que la corde soit cité dans le test de crochets. À l'aide d'un non-cotées chaîne avec! -z
, ou même simplement de la non cotées de la chaîne de seul au sein de test crochets (voir l'Exemple 7-6) fonctionne normalement, cependant, c'est une pratique dangereuse. Toujours citer testé chaîne. [1]
Je sais $@
est spécial mais je ne savais pas que c'était assez spécial de violer négation booléenne. Ce qui se passe ici?
$ bash -version | head -1
GNU bash, version 4.2.42(2)-release (i386-apple-darwin12.2.0)
Le numérique réelle codes de sortie sont tous 1
ou 0
comme par
$ [ -n "$@" ]; echo "$?"
0
OriginalL'auteur Mike Samuel | 2013-03-04
Vous devez vous connecter pour publier un commentaire.
Quand
$@
est vide,"$@"
ne s'étend pas à une chaîne vide; il est entièrement supprimée. Si votre test n'est pasmais plutôt
Maintenant
-n
n'est pas un opérateur, mais juste une chaîne non vide, qui a toujours des tests comme vrai.$@
est certains lexicale sucre syntaxique qui non évidemment déclenche "Le-n
test nécessite que la corde soit cité" mise en garde.C'est pourquoi je m'en tiens à
[[
en bash.Je viens de vérifier que
[[...]]
est assez intelligent pour voir que-n
est absent de son argument.Ok, alors peut-être que je devrais arrêter d'être un dinosaure et il suffit de supposer que
[[...]]
sera disponible quand j'écris un script, sauf si j'ai des raisons de croire le contraire.C'est probablement une erreur d'utiliser
"$@"
dans ce contexte, en premier lieu. S'il y a plusieurs arguments, il sera étendu à[[ -n "arg1" "arg2" ]]
, ce qui n'est pas valide.OriginalL'auteur chepner
"$@"
ne fait pas ce que vous attendez. Ce n'est pas une forme différente de"$*"
, elle s'étend à la cité de la liste d'arguments passés au script courant.Si il n'y a pas d'arguments, il se dilate à rien. Si il y a deux arguments
a
etb c
, puis il s'élargit pour"a" "b c"
(c'est à dire qu'elle conserve les espaces dans les arguments), tandis que"$*"
étend à"a b c"
et$*
permettrait d'élargir àa b c
(trois mots).OriginalL'auteur Aaron Digulla