Workstation online OnWorks Linux e Windows

Logo

Hosting online gratuito per workstation

<Precedenti | Contenuti | Succ.>

Combinazione di espressioni

È anche possibile combinare espressioni per creare valutazioni più complesse. Le espressioni vengono combinate utilizzando operatori logici. Li abbiamo visti nel capitolo 17, quando abbiamo appreso del Find comando. Ci sono tre operazioni logiche per test ed [[]]. Sono AND, OR e NOT. test ed [[]] utilizzare diversi operatori per rappresentare queste operazioni:


Tabella 27-4: Operatori logici


Funzionamento test [[ ]] e (( ))

Funzionamento test [[ ]] e (( ))

E -un &&


Immagine

OR -o ||


Immagine

NON ! !


Immagine


Ecco un esempio di operazione AND. Lo script seguente determina se un numero intero rientra in un intervallo di valori:



#! / Bin / bash


# test-integer3: determina se un intero è all'interno di a

# intervallo di valori specificato.


VAL_MIN=1 VAL_MAX=100


INT=50

#! / Bin / bash


# test-integer3: determina se un intero è all'interno di a

# intervallo di valori specificato.


VAL_MIN=1 VAL_MAX=100


INT=50



if [[ "$INT" =~ ^-?[0-9]+$ ]]; poi

if [[ INT -ge MIN_VAL && INT -le MAX_VAL ]]; then echo "$INT è compreso tra $MIN_VAL e $MAX_VAL."

altro

echo "$INT è fuori portata."

per altro

echo "INT non è un numero intero." >&2 uscita 1

fi


if [[ "$INT" =~ ^-?[0-9]+$ ]]; poi

if [[ INT -ge MIN_VAL && INT -le MAX_VAL ]]; then echo "$INT è compreso tra $MIN_VAL e $MAX_VAL."

altro

echo "$INT è fuori portata."

per altro

echo "INT non è un numero intero." >&2 uscita 1

fi


In questo script, determiniamo se il valore di intero INT si trova tra i valori di VAL_MIN ed MAX_VAL. Questo viene eseguito da un singolo uso di [[]], che include due espressioni separate da && operatore. Avremmo anche potuto codificare questo usando test:


if [ $INT -ge $MIN_VAL -a $INT -le $MAX_VAL ]; then echo "$INT è compreso tra $MIN_VAL e $MAX_VAL."

altro

echo "$INT è fuori portata."

fi

if [ $INT -ge $MIN_VAL -a $INT -le $MAX_VAL ]; then echo "$INT è compreso tra $MIN_VAL e $MAX_VAL."

altro

echo "$INT è fuori portata."

fi


I ! l'operatore di negazione inverte il risultato di un'espressione. Restituisce vero se un'espressione è falsa e restituisce falso se un'espressione è vera. Nello script seguente, modifichiamo la logica della nostra valutazione per trovare i valori di INT che sono al di fuori dell'intervallo specificato:



#! / Bin / bash


# test-integer4: determina se un intero è esterno a a

# intervallo di valori specificato.


VAL_MIN=1 VAL_MAX=100


INT=50


if [[ "$INT" =~ ^-?[0-9]+$ ]]; poi

Se [[ ! (INT -ge MIN_VAL && INT -le MAX_VAL) ]]; then echo "$INT è al di fuori di $MIN_VAL fino a $MAX_VAL."

altro

echo "$INT è nell'intervallo."

#! / Bin / bash


# test-integer4: determina se un intero è esterno a a

# intervallo di valori specificato.


VAL_MIN=1 VAL_MAX=100


INT=50


if [[ "$INT" =~ ^-?[0-9]+$ ]]; poi

Se [[ ! (INT -ge MIN_VAL && INT -le MAX_VAL) ]]; then echo "$INT è al di fuori di $MIN_VAL fino a $MAX_VAL."

altro

echo "$INT è nell'intervallo."



echo "INT non è un numero intero." >&2 uscita 1

fi


echo "INT non è un numero intero." >&2 uscita 1

fi

Includiamo anche parentesi intorno all'espressione, per il raggruppamento. Se queste non fossero incluse, la negazione si applicherebbe solo alla prima espressione e non alla combinazione delle due. Codificando questo con test sarebbe fatto in questo modo:


Se [ ! \( $INT -ge $MIN_VAL -a $INT -le $MAX_VAL \) ]; then echo "$INT è al di fuori di $MIN_VAL fino a $MAX_VAL."

altro

echo "$INT è nell'intervallo."

fi

Se [ ! \( $INT -ge $MIN_VAL -a $INT -le $MAX_VAL \) ]; then echo "$INT è al di fuori di $MIN_VAL fino a $MAX_VAL."

altro

echo "$INT è nell'intervallo."

fi


Poiché tutte le espressioni e gli operatori utilizzati da test sono trattati come argomenti di comando dalla shell (a differenza di [[]] ed (( )) ), caratteri che hanno un significato speciale per bash, come <, >, (e ), deve essere tra virgolette o caratteri di escape.

Immagine

Visto che test ed [[]] fare più o meno la stessa cosa, che è preferibile? test è tradizionale (e parte di POSIX), mentre [[]] è specifico per bash. È importante saperlo usare test, poiché è molto utilizzato, ma [[]] è chiaramente più utile ed è più facile da codificare, quindi è preferito per gli script moderni.


La portabilità è l'hobgoblin delle piccole menti

Se parli con persone "vere" di Unix, scopri subito che a molti di loro non piace molto Linux. Lo considerano impuro e impuro. Un principio degli utenti Unix è che tutto dovrebbe essere "portatile". Ciò significa che qualsiasi script che scrivi dovrebbe essere in grado di funzionare, invariato, su qualsiasi sistema simile a Unix.

Le persone Unix hanno buone ragioni per crederci. Avendo visto cosa hanno fatto le estensioni proprietarie ai comandi e alle shell nel mondo Unix prima di POSIX, sono naturalmente diffidenti nei confronti dell'effetto di Linux sul loro amato sistema operativo.

Ma la portabilità ha un serio svantaggio. Impedisce il progresso. Richiede che le cose vengano sempre fatte usando tecniche del "minimo comune denominatore". Nel caso della programmazione della shell, significa rendere tutto compatibile con sh, la shell Bourne originale.



Immagine

Questo aspetto negativo è la scusa che i fornitori di software proprietario usano per giustificare le loro estensioni proprietarie, solo che le chiamano "innovazioni". Ma in realtà sono solo dispositivi bloccati per i loro clienti.

Gli strumenti GNU, come bash, non hanno tali restrizioni. Incoraggiano la portabilità sostenendo gli standard ed essendo universalmente disponibili. Puoi installare bash e gli altri strumenti GNU su quasi tutti i tipi di sistema, anche Windows, senza costi. Quindi sentiti libero di utilizzare tutte le funzionalità di bash. È veramente portatile.


Il miglior sistema operativo cloud computing su OnWorks: