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