Ma question porte sur les valeurs de retour produites par ce code:
if [ -n ]; then echo "true"; else echo "false"; fi
Cela imprime true
.
Son test complémentaire utilisant [ -z ]
imprime également true
:
if [ -z ]; then echo "true"; else echo "false"; fi
Dans le code ci-dessus, pourquoi le [ -n ]
test suppose-t-il que la valeur de chaîne qui n'est pas du tout passée, comme non nulle?
Le code ci-dessous s'imprime false
. Cela est attendu car la valeur de chaîne transmise est nulle et de longueur nulle.
if [ -n "" ]; then echo "true"; else echo "false"; fi
[ -t ]
testait si stdout était un terminal (abréviation de[ -t 1 ]
) et que certains shells le font toujours (dans le casksh93
où cela-t
n'est que littéral), il est donc préférable d'utiliser[ -n "$var" ]
que[ "$var" ]
. Bien que cela échouerait toujours dans certaines anciennestest
implémentations pour des valeurs$var
similaires=
, auquel cas[ "" != "$var" ]
ou[ "x$var" != x ]
oucase $x in "")...
peut-être mieux.-o
ici. Dans certains shells commebash
,-o
est à la fois un opérateur unaire (test si une option est définie) et binaire (ou), donc les choses comme[ ! -o monitor ]
sont ambiguës. Teste-t-il que l'monitor
option n'est pas définie, ou que les chaînes sont!
oumonitor
non vides? Les règles POSIX décident: ce dernier (c'est différent avec[[ ! -o monitor ]]
).[ -n ]
n'utilise pas le-n
test.L'
-n
entré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-n
n'est pas vide - il contient deux caractères,-
etn
, non nul characters--[ -n ]
evalue à true.Comme le dit Ignacio Vazquez-Abrams , où se
string
trouve un seul argument, le test effectué surstring
in 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-n
est un opérande de chaîne.Pour la même raison qui
[ -n ]
n'utilise pas le-n
test,[ -z ]
n'utilise pas le-z
test.Vous pouvez en savoir plus sur
[
enbash
en examinant l'aide correspondante. Notez que c'est un shell intégré :Ainsi, vous pouvez exécuter
help [
pour obtenir de l'aide à ce sujet: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 commandehelp test
, vous obtenez une liste détaillée. Plutôt que de tout reproduire, voici la partie sur les opérateurs de chaînes:Notez cela
-n STRING
etSTRING
faites la même chose: ils testent si la chaîneSTRING
n'est pas vide.la source
IFS
espaces blancs, le feront; les variables qui contiennent plusieurs mots au lieu de zéro produisent un autre effet et peuvent entraîner l'exécution d'un test complètement différent. Les chaînes qui apparaissent littéralement avec l'intention d'être des opérandes ne fonctionneront correctement que si elles ne contiennent ni espaces ni tabulations ou si elles sont entre guillemets. La réponse deviendrait beaucoup plus longue et compliquée si je couvrais ce sujet de manière accessible. Si vous décidez de poster une réponse, n'hésitez pas à @ me ici à ce sujet![ "$var" ]
serait jamais utilisable comme test car$var
pourrait s'étendre à-n
.[ -n ]
est vrai car la[
commande (alias latest
commande) agit sur le nombre d'arguments qui lui sont donnés. S'il ne reçoit qu'un seul argument, le résultat est "vrai" si l'argument est une chaîne non vide. "-n" est une chaîne de 2 caractères, non vide, donc "true".la source