Réponses:
Les crochets simples dans le shell sont synonymes de test
(soit la commande séparée, soit le shell intégré), ce qui [ 0 ]
signifie donc la même chose que test 0
. test
sert à faire des comparaisons et à tester les attributs des fichiers, comme vous pouvez le lire dans sa page de manuel. Lorsqu'il ne reçoit pas d'expression qui ressemble à une comparaison, à un test de fichier ou à l'une des autres opérations qu'il peut effectuer, il testera plutôt si l'argument est présent et une chaîne non vide. Ni l'une 0
ni l' autre ne 1
sont des entrées vraiment appropriées pour le test, et comme le test de chaînes non vides réussit simplement et votre boucle while boucle pour toujours.
Vous voudrez peut-être essayer à la place
while false; do
echo "hello"
done
remplaçant éventuellement false
par true
. Ou peut-être que vous voulez utiliser (( ))
:
while (( 0 )); do
echo "hello"
done
Qui se comportera comme la plupart des langues, où 0 signifie échec / faux et 1 signifie succès / vrai.
0
et 1
ne sont pas des chaînes vides. Les nouveaux programmeurs shell écrivent souvent à la if [ 1=2 ]
place de if [ 1 = 2 ]
et se demandent pourquoi le premier est toujours vrai. C'est vrai car c'est un seul argument et ce n'est pas une chaîne vide.
La valeur 0 ici n'agit pas comme une constante numérique, mais comme une chaîne de caractères. Ces tests sont tous équivalents dans leur effet de produire un statut de terminaison réussi:
[ A ]
[ "XYZ" ]
[ 0 ]
ceux-ci produisent un statut de fin d'échec:
[ ]
[ "" ]
il y a un argument non vide, qui est évalué comme vrai logique. Cela vous permet de faire des choses comme:
if [ $UNDER_NUCLEAR_ATTACK ] ; then
launch-missiles -a $DRY_RUN # $DRY_RUN set to "-n" during testing
fi
La variable UNDER_NUCLEAR_ATTACK
est définie sur toute valeur non vide pour indiquer vrai, ou est non définie ou vide pour indiquer faux.
Nous pouvons appliquer l' !
opérateur pour inverser la logique:
[ ! a ] # fails: a is nonblank so true; and not true is false.
[ ! ] # succeeds: blank is false, not blank is true.
Pour évaluer une condition numérique, vous devez utiliser des opérateurs de test numériques:
while [ $A -gt $B ] ; do ...
Si A
et B
contiennent des chaînes qui ressemblent à des nombres décimaux, elles sont comparées comme des nombres et si A
est supérieur à B
, la boucle s'exécute. Supposons donc que ce UNDER_NUCLEAR_ATTACK
ne soit pas un booléen de type chaîne vide ou non vide, mais en fait un booléen numérique qui soit 0
(faux) ou une autre valeur (vrai). Dans ce cas, nous écririons le test comme ceci:
if [ $UNDER_NUCLEAR_ATTACK -ne 0 ] ; then ...
Une construction if / then teste si l'état de sortie d'une liste de commandes est 0 (puisque 0 signifie "succès" par convention UNIX), et si c'est le cas, exécute une ou plusieurs commandes.
En bref, vous renvoyez un résultat de test nul.
[
obtient un seul argument (excluant le ]
, bien sûr), il quitte avec le statut zéro si l'argument n'est pas vide, différent de zéro s'il l'est. Ainsi, par exemple, [ 1 ]
retournera également un code de sortie de 0
.
La valeur 0 est considérée comme vraie pour la boucle while donc la condition pour la boucle while est vraie et donc continue d'afficher la boucle infinie. Le est vrai si nous remplaçons 0 par 1, comme tout entier que nous écrivons entre la condition, il retournera vrai
[ ]
(sans argument) et[ "" ]
(avec un seul argument vide) ne réussissent pas .