46 votes

pourquoi true == false dans bash?

Pourquoi bash a-t-il le comportement suivant?

 echo $((true == false))
1
 

J'aurais pensé que cela imprimerait 0 , mais cela imprimerait 1 .

Ceci est encore compliqué par les faits suivants:

 > echo $((true))
0
> echo $((false))
0
> echo $((true == true))
1
> echo $((false == false))
1
 

56voto

zostay Points 2879

Toutes les affiches de parler de 0 pour être vrai et 1 fausse d'avoir manqué le point. Dans ce cas, 1 est vraie et 0 est faux dans l'habitude boolean sens en raison de l'arithmétique contexte de l'évaluation causée par $(()).

L' == fonctionnement à l'intérieur de l' $(()) n'est pas l'égalité de retour statuts de Bash, il effectue numérique de l'égalité à l'aide de la littéraux de donnée où les "faux" et "vrai" sont traitées comme des variables, mais n'ont pas encore été lié, qui sont interprétés comme 0, car ils ont aucune valeur n'a encore été attribuée:

$ echo $((true))
0
$ echo $((false))
0

Si vous voulez comparer l'état de retour du vrai et du faux, vous voulez quelque chose comme:

true
TRUE=$?
false
FALSE=$?
if (( $TRUE == $FALSE )); then echo TRUE; else echo FALSE; fi

Mais, je ne suis pas sûr de savoir pourquoi vous voulez le faire.

EDIT: correction de la partie à l'origine, sur la réponse "vrai" et "faux" être interprétés comme des chaînes. Ils ne le sont pas. Ils sont traités comme des variables, mais n'ont pas de valeur lié à eux encore.

22voto

fge Points 40850

OK, donc, il semble y avoir beaucoup de confusion sur ce qu' $((...)) fait vraiment.

Il ne arithmétique de l'évaluation de ses opérandes, barewords sont variables, pas de commandes ou des littéraux de chaîne (c'est à dire, true est vraiment $true), et de tout ce qui n'est pas un nombre est égal à 0. L' == opérateur compare deux nombres, et retourne 1 si elles sont égales.

C'est pourquoi $((true == false)) est de 1: il n'y a pas d' true ou false variables d'environnement dans l'environnement, qui signifie à la fois $true et $false évaluer une chaîne de caractères vide, donc 0 dans l'arithmétique contexte!

Pour être complet, vous pouvez également utiliser la commande de substitution dans l'arithmétique contexte... Par exemple:

$ echo $((`echo 2`))
2
$ echo $((3 + $(echo 4)))
7
$ a=3
$ echo $((a + $(echo 4)))
7
# undefine a
$ a=
$ echo $((a + $(echo 4)))
4
$ a="Hello world"
$ echo $((a + 1))
1
# undefine a again
$ a=
$ echo $(($(echo $a)))
0

2voto

Pubby Points 29386

1 est faux en bash, vous donnant le comportement correct.

Voir ceci: Pourquoi 0 est vrai mais faux est 1 en bash?

-2voto

somallg Points 11

Parce que dans bash, 0 est vrai et tout autre que 0 est faux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X