Je vois le même comportement pour la boucle ci-dessous que la boucle avec while [ 1 ]
. Pourquoi est-ce si?
while [ 0 ]; do
echo "hello"
done
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.
[ ]
(sans argument) et[ "" ]
(avec un seul argument vide) ne réussissent pas .0
et1
ne sont pas des chaînes vides. Les nouveaux programmeurs shell écrivent souvent à laif [ 1=2 ]
place deif [ 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:
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:
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:Pour évaluer une condition numérique, vous devez utiliser des opérateurs de test numériques:
Si
A
etB
contiennent des chaînes qui ressemblent à des nombres décimaux, elles sont comparées comme des nombres et siA
est supérieur àB
, la boucle s'exécute. Supposons donc que ceUNDER_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 soit0
(faux) ou une autre valeur (vrai). Dans ce cas, nous écririons le test comme ceci:la source
En bref, vous renvoyez un résultat de test nul.
http://www.tldp.org/LDP/abs/html/testconstructs.html
la source
[
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 de0
.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
la source