<Precedenti | Contenuti | Succ.>
Elementi Logici
Come abbiamo scoperto nel capitolo 27, il (( )) Il comando compound supporta diversi operatori di confronto. Ce ne sono alcuni altri che possono essere utilizzati per valutare la logica. Ecco l'elenco completo:
Tabella 34-6: Operatori di confronto
Descrizione dell'operatore
Descrizione dell'operatore
<= Minore o uguale a
>= Maggiore o uguale a
<Meno di
> Maggiore di
== Uguale a
!= Non uguale a
&& AND logico
|| OR logico
espr1?espr2:espr3 Operatore di confronto (ternario). Se espressione espr1
viene valutato come diverso da zero (aritmeticamente vero) allora espr2, altro espr3.
Quando vengono utilizzate per operazioni logiche, le espressioni seguono le regole della logica aritmetica; ovvero, le espressioni che vengono valutate come zero sono considerate false, mentre le espressioni diverse da zero sono considerate vere. (( )) il comando compound mappa i risultati nei normali codici di uscita della shell:
[io@linuxbox~]$ se ((1)); allora echo "vero"; altrimenti echo "falso"; fi
vero
[io@linuxbox~]$ se ((0)); allora echo "vero"; altrimenti echo "falso"; fi
falso
[io@linuxbox~]$ se ((1)); allora echo "vero"; altrimenti echo "falso"; fi
vero
[io@linuxbox~]$ se ((0)); allora echo "vero"; altrimenti echo "falso"; fi
falso
Il più strano degli operatori logici è il operatore ternarioQuesto operatore (modellato su quello del linguaggio di programmazione C) esegue un test logico autonomo. Può essere utilizzato come una sorta di istruzione if/then/else. Agisce su tre espressioni aritmetiche (le stringhe non funzionano) e se la prima espressione è vera (o diversa da zero) viene eseguita la seconda espressione. In caso contrario, viene eseguita la terza espressione. Possiamo provarlo sulla riga di comando:
[io@linuxbox~]$ a = 0 [io@linuxbox~]$ ((a<1?++a:--a)) [io@linuxbox~]$ eco $a
1
[io@linuxbox~]$ ((a<1?++a:--a))
[io@linuxbox~]$ eco $a
0
[io@linuxbox~]$ a = 0 [io@linuxbox~]$ ((a<1?++a:--a)) [io@linuxbox~]$ eco $a
1
[io@linuxbox~]$ ((a<1?++a:--a))
[io@linuxbox~]$ eco $a
0
Qui vediamo un operatore ternario in azione. Questo esempio implementa un toggle. Ogni volta che l'operatore viene eseguito, il valore della variabile a passa da zero a uno o viceversa.
Si prega di notare che l'esecuzione dell'assegnazione all'interno delle espressioni non è semplice.
Quando tentato, bash dichiarerà un errore:
[io@linuxbox~]$ a = 0
[io@linuxbox~]$ ((a<1?a+=1:a-=1))
bash: ((: a<1?a+=1:a-=1: tentativo di assegnazione a una non variabile (il token di errore è "-=1")
[io@linuxbox~]$ a = 0
[io@linuxbox~]$ ((a<1?a+=1:a-=1))
bash: ((: a<1?a+=1:a-=1: tentativo di assegnazione a una non variabile (il token di errore è "-=1")
Questo problema può essere mitigato racchiudendo l'espressione di assegnazione tra parentesi:
[io@linuxbox~]$ ((a<1?(a+=1):(a-=1)))
[io@linuxbox~]$ ((a<1?(a+=1):(a-=1)))
Di seguito, vediamo un esempio più completo dell'utilizzo degli operatori aritmetici in uno script che produce una semplice tabella di numeri:
#! / Bin / bash
# arith-loop: script per dimostrare gli operatori aritmetici finished=0
a = 0
printf "a\ta**2\ta**3\n" printf "=\t====\t====\n"
finché ((finito)); fai b=$((a**2))
c=$((a**3))
printf "%d\t%d\t%d\n" $a $b $c ((a<10?++a:(finito=1)))
fatto
#! / Bin / bash
# arith-loop: script per dimostrare gli operatori aritmetici finished=0
a = 0
printf "a\ta**2\ta**3\n" printf "=\t====\t====\n"
finché ((finito)); fai b=$((a**2))
c=$((a**3))
printf "%d\t%d\t%d\n" $a $b $c ((a<10?++a:(finito=1)))
fatto
In questo script, implementiamo un ciclo until basato sul valore di finito variabile. Inizialmente, la variabile è impostata a zero (aritmetica falsa) e continuiamo il ciclo finché non diventa diversa da zero. All'interno del ciclo, calcoliamo il quadrato e il cubo della variabile contatore
a. Alla fine del ciclo, viene valutato il valore della variabile contatore. Se è inferiore a 10 (il numero massimo di iterazioni), viene incrementato di uno, altrimenti alla variabile finished viene assegnato il valore uno, rendendo finished aritmeticamente vero e terminando così il ciclo. L'esecuzione dello script fornisce questo risultato:
[io@linuxbox~]$ ciclo aritmetico
[io@linuxbox~]$ ciclo aritmetico
a
= 0
1
2
3
4
5
6
7
8
9
10
a
= 0
1
2
3
4
5
6
7
8
9
10
un**2 un**3
==== ====
un**2 un**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