<Précédent | Table des matières | Suivant>
Logique
Comme nous l'avons découvert au chapitre 27, le (( )) La commande composée prend en charge une variété d'opérateurs de comparaison. Il y en a quelques autres qui peuvent être utilisés pour évaluer la logique. Voici la liste complète:
Tableau 34-6 : Opérateurs de comparaison
Description de l'opérateur
Description de l'opérateur
<= inférieur ou égal à
>= Supérieur ou égal à
< Inférieur à
> Supérieur à
== Égal à
!= Non égal à
&& ET logique
|| OU logique
expression1?expression2:expression3 Opérateur de comparaison (ternaire). Si expression expression1
est évalué comme non nul (arithmétique vrai) alors expression2, autre expression3.
Lorsqu'elles sont utilisées pour des opérations logiques, les expressions suivent les règles de la logique arithmétique ; c'est-à-dire que les expressions évaluées à zéro sont considérées comme fausses, tandis que les expressions non nulles sont considérées comme vraies. Les (( )) La commande composée mappe les résultats dans les codes de sortie normaux du shell :
[moi@linuxbox ~]$ si ((1)); puis echo "true" ; else echo "faux" ; Fi
oui
[moi@linuxbox ~]$ si ((0)); puis echo "true" ; else echo "faux" ; Fi
non
[moi@linuxbox ~]$ si ((1)); puis echo "true" ; else echo "faux" ; Fi
oui
[moi@linuxbox ~]$ si ((0)); puis echo "true" ; else echo "faux" ; Fi
non
Le plus étrange des opérateurs logiques est le opérateur ternaire. Cet opérateur (qui est calqué sur celui du langage de programmation C) effectue un test logique autonome. Il peut être utilisé comme une sorte d'instruction if/then/else. Il agit sur trois expressions arithmétiques (les chaînes ne fonctionneront pas), et si la première expression est vraie (ou non nulle), la deuxième expression est exécutée. Sinon, la troisième expression est exécutée. Nous pouvons essayer ceci sur la ligne de commande :
[moi@linuxbox ~]$ a = 0 [moi@linuxbox ~]$ ((a<1?++a:--a)) [moi@linuxbox ~]$ faire écho $a
1
[moi@linuxbox ~]$ ((a<1?++a:--a))
[moi@linuxbox ~]$ faire écho $a
0
[moi@linuxbox ~]$ a = 0 [moi@linuxbox ~]$ ((a<1?++a:--a)) [moi@linuxbox ~]$ faire écho $a
1
[moi@linuxbox ~]$ ((a<1?++a:--a))
[moi@linuxbox ~]$ faire écho $a
0
Ici, nous voyons un opérateur ternaire en action. Cet exemple implémente une bascule. A chaque exécution de l'opérateur, la valeur de la variable a passe de zéro à un ou vice versa.
Veuillez noter que l'exécution de l'affectation dans les expressions n'est pas simple.
Lors d'une tentative, bash déclarera une erreur :
[moi@linuxbox ~]$ a = 0
[moi@linuxbox ~]$ ((a<1?a+=1:a-=1))
bash : (( : a<1?a+=1:a-=1 : tentative d'affectation à une variable (le jeton d'erreur est "-=1")
[moi@linuxbox ~]$ a = 0
[moi@linuxbox ~]$ ((a<1?a+=1:a-=1))
bash : (( : a<1?a+=1:a-=1 : tentative d'affectation à une variable (le jeton d'erreur est "-=1")
Ce problème peut être atténué en entourant l'expression d'affectation de parenthèses :
[moi@linuxbox ~]$ ((a<1?(a+=1):(a-=1)))
[moi@linuxbox ~]$ ((a<1?(a+=1):(a-=1)))
Ensuite, nous voyons un exemple plus complet d'utilisation d'opérateurs arithmétiques dans un script qui produit une simple table de nombres :
#! / Bin / bash
# arith-loop : script pour démontrer les opérateurs arithmétiques terminé=0
a = 0
printf "a\ta**2\ta**3\n" printf "=\t====\t====\n"
jusqu'à ((fini)); faire b=$((a**2))
c=$((a**3))
printf "%d\t%d\t%d\n" $a $b $c ((a<10?++a:(fini=1)))
fait
#! / Bin / bash
# arith-loop : script pour démontrer les opérateurs arithmétiques terminé=0
a = 0
printf "a\ta**2\ta**3\n" printf "=\t====\t====\n"
jusqu'à ((fini)); faire b=$((a**2))
c=$((a**3))
printf "%d\t%d\t%d\n" $a $b $c ((a<10?++a:(fini=1)))
fait
Dans ce script, nous implémentons une boucle until basée sur la valeur du manteau variable. Initialement, la variable est mise à zéro (arithmétique fausse) et nous continuons la boucle jusqu'à ce qu'elle devienne non nulle. Dans la boucle, nous calculons le carré et le cube de la variable compteur
une. A la fin de la boucle, la valeur de la variable compteur est évaluée. S'il est inférieur à 10 (le nombre maximum d'itérations), il est incrémenté de un, sinon la variable fini prend la valeur un, ce qui rend fini arithmétiquement vrai, mettant ainsi fin à la boucle. L'exécution du script donne ce résultat :
[moi@linuxbox ~]$ boucle arithmétique
[moi@linuxbox ~]$ boucle arithmétique
a
= 0
1
2
3
4
5
6
7
8
9
10
a
= 0
1
2
3
4
5
6
7
8
9
10
une**2 une**3
==== ====
une**2 une**3
==== ====
0
1
4
9
16
25
36
49
64
81
100
0
1
4
9
16
25
36
49
64
81
100
0
1
8
27
64
125
216
343
512
729
1000
0
1
8
27
64
125
216
343
512
729
1000