[ -n ]n'utilise pas le -ntest.
L' -nentrée [ -n ]n'est pas du tout un test. Lorsqu'il n'y a qu'un seul argument entre [et ], cet argument est une chaîne qui est testée pour voir si elle est vide. Même lorsque cette chaîne a un début -, elle est toujours interprétée comme un opérande et non comme un test. Étant donné que la chaîne -nn'est pas vide - il contient deux caractères, -et n, non nul characters-- [ -n ]evalue à true.
Comme le dit Ignacio Vazquez-Abrams , où se stringtrouve un seul argument, le test effectué sur stringin est le même que le test effectué sur it par . Quand cela arrive , rien de spécial ne se produit. Le dans et la seconde en sont simplement des chaînes testé pour le vide.[ string ][ -n string ]string-n-n[ -n ]-n[ -n -n ]
Lorsqu'il n'y a qu'un seul argument entre [et ], cet argument est toujours une chaîne à tester pour le non-vide, même s'il se trouve être nommé de la même manière qu'un test. De même, lorsqu'il y a deux arguments entre [et ]et que le premier l'est -n, le second est toujours une chaîne à tester pour la non-absence, même s'il se trouve être nommé de la même manière qu'un test. C'est simplement parce que la syntaxe de [insiste sur le fait qu'un seul argument entre [et ]ou après -nest un opérande de chaîne.
Pour la même raison qui [ -n ]n'utilise pas le -ntest, [ -z ]n'utilise pas le -ztest.
Vous pouvez en savoir plus sur [en bashen examinant l'aide correspondante. Notez que c'est un shell intégré :
$ type [
[ is a shell builtin
Ainsi, vous pouvez exécuter help [pour obtenir de l'aide à ce sujet:
$ help [
[: [ arg... ]
Evaluate conditional expression.
This is a synonym for the "test" builtin, but the last argument must
be a literal `]', to match the opening `['.
Pour plus d'informations, notamment sur les tests pris en charge et leur fonctionnement, vous devrez consulter l'aide test. Lorsque vous exécutez la commande help test, vous obtenez une liste détaillée. Plutôt que de tout reproduire, voici la partie sur les opérateurs de chaînes:
-z STRING True if string is empty.
-n STRING
STRING True if string is not empty.
STRING1 = STRING2
True if the strings are equal.
STRING1 != STRING2
True if the strings are not equal.
STRING1 < STRING2
True if STRING1 sorts before STRING2 lexicographically.
STRING1 > STRING2
True if STRING1 sorts after STRING2 lexicographically.
Notez cela -n STRINGet STRINGfaites la même chose: ils testent si la chaîne STRINGn'est pas vide.
[ -t ]testait si stdout était un terminal (abréviation de[ -t 1 ]) et que certains shells le font toujours (dans le casksh93où cela-tn'est que littéral), il est donc préférable d'utiliser[ -n "$var" ]que[ "$var" ]. Bien que cela échouerait toujours dans certaines anciennestestimplémentations pour des valeurs$varsimilaires=, auquel cas[ "" != "$var" ]ou[ "x$var" != x ]oucase $x in "")...peut-être mieux.