Tests booléens Bash
Je suis d'essayer d'exécuter un bloc de code si un indicateur est défini sur true et l'autre est définie sur false. ie
var1=true
var2=false
if [[ $var1 && ! $var2 ]]; then var2="something"; fi
Depuis qui n'évaluent pas de la manière que je l'ai attendu, j'ai écrit plusieurs autres cas de test et je vais avoir du mal à comprendre comment ils sont évalués.
aa=true
bb=false
cc="python"
if [[ "$aa" ]]; then echo "Test0" ; fi
if [[ "$bb" ]]; then echo "Test0.1" ; fi
if [[ !"$aa" ]]; then echo "Test0.2" ; fi
if [[ ! "$aa" ]]; then echo "Test0.3" ; fi
if [[ "$aa" && ! "$bb" ]]; then echo "Test1" ; fi
if [[ "$aa" && ! "$aa" ]]; then echo "Test2" ; fi
if [[ "$aa" ]] && ! [[ "$bb" ]]; then echo "test3" ; fi
if [[ "$aa" ]] && ! [[ "$cc" ]]; then echo "test4" ; fi
if [[ $aa && ! $bb ]]; then echo "Test5" ; fi
if [[ $aa && ! $aa ]]; then echo "Test6" ; fi
if [[ $aa ]] && ! [[ $bb ]]; then echo "test7" ; fi
if [[ $aa ]] && ! [[ $cc ]]; then echo "test8" ; fi
Quand je lance le précédent codeblock la seule sortie que j'obtiens est
Test0
Test0.1
Test0.2
cependant, mon attente est que je voudrais obtenir
Test0
Test1
Test3
Test5
Test7
J'ai essayé de comprendre la meilleure façon d'exécuter des tests similaires, cependant, la plupart des exemples que j'ai trouvés sont mis en place dans le format de
if [[ "$aa" == true ]];
ce qui n'est pas tout à fait ce que je veux faire. Donc ma question est quel est le meilleur moyen de faire des comparaisons de ce genre, et pourquoi plusieurs des cas de test que je m'attends à passer tout simplement pas?
Merci!
source d'informationauteur JLMarks
Vous devez vous connecter pour publier un commentaire.
Sans opérateurs,
[[
vérifie uniquement si la variable est vide. Si c'est le cas, alors il est considéré comme faux, sinon il est considéré comme le vrai. Le contenu des variables n'a pas d'importance.Votre compréhension de booléens dans contextuel du shell est incorrect.
À la fois les variables ci-dessus sont vrai car ceux-ci sont non-vides chaînes.
Vous pourriez faire usage de l'arithmétique contexte:
true
etfalse
sont évalués comme des chaînes de caractères 😉[[ $var ]]
est un équivalent de[[ -n $var ]]
que vérifier si$var
est vide ou pas.Puis, pas besoin de citer vos variables à l'intérieur de
[[
. Voir ce rappel.Enfin, voici une explication de la différence entre
&&
à l'intérieur des crochets et à l'extérieur.Le shell n'a pas de variables Booléennes, en soi. Cependant, il y a commandes nommé
true
etfalse
dont la sortie statuts sont 0 et 1, respectivement, et peut donc être utilisé de la même façon à des valeurs Booléennes.La différence est qu'au lieu de tester si
var1
est définie sur la valeur true, vous les développez le nom d'une commande, qui réussit. De même,var2
est élargi à un nom de la commande qui s'exécute et échoue, mais parce qu'il est précédé de la lettre!
le statut de sortie est inversé pour indiquer la réussite.(À noter que contrairement à la plupart des langages de programmation, un statut de sortie de 0 indique la réussite, car bien que la plupart des commandes de 1 moyen de réussir, il y a beaucoup de manières différentes, ils peuvent échouer, si différentes des valeurs non nulles peuvent être attribuées des significations différentes.)
Le plus proche, vous pouvez venir semble être utiliser des fonctions au lieu de variables, vous pouvez utiliser leur statut de retour dans des conditions.
et nous pouvons tester de cette façon
ou de cette façon
Espère que cette aide.