Workstation online OnWorks Linux e Windows

Logo

Hosting online gratuito per workstation

<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


Immagine

>= Maggiore o uguale a


Immagine

<Meno di


Immagine

> Maggiore di


Immagine


Immagine

== Uguale a


Immagine

!= Non uguale a


Immagine

&& AND logico


Immagine

|| OR logico


Immagine

espr1?espr2:espr3 Operatore di confronto (ternario). Se espressione espr1

viene valutato come diverso da zero (aritmeticamente vero) allora espr2, altro espr3.


Immagine


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


Immagine

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

Il miglior sistema operativo cloud computing su OnWorks: