Istruzioni If!
Decisioni, decisioni.
Introduzione
Bash if istruzioni sono molto utili. In questa sezione del nostro tutorial di scripting Bash imparerai i modi in cui puoi usare le istruzioni if nei tuoi script Bash per automatizzare le attività.
Le istruzioni If (e, strettamente correlate, le istruzioni case) ci consentono di prendere decisioni nei nostri script Bash. Ci permettono di decidere se eseguire o meno un pezzo di codice in base alle condizioni che possiamo impostare., Le istruzioni If, combinate con i loop (che vedremo nella prossima sezione) ci permettono di creare script molto più complessi che possono risolvere compiti più grandi.
Come quello che abbiamo visto nelle sezioni precedenti, la loro sintassi è molto specifica in modo da rimanere in cima a tutti i piccoli dettagli.
Istruzioni If di base
Un’istruzione if di base dice in modo efficace, se un particolare test è vero, quindi eseguire un determinato insieme di azioni. Se non è vero, non eseguire tali azioni., If segue il seguente formato:
if
then
<comandi>
fi
Qualsiasi cosa tra allora e fi (se all’indietro) verrà eseguita solo se il test (tra parentesi quadre) è vero.
Diamo un’occhiata a un semplice esempio:
if_example.sh
- #!/ bin / bash
- # Di base se dichiarazione
- se
- poi
- echo Hey che è un gran numero.,
- pwd
- fi
- date
Scomponiamolo:
- Riga 4 – Vediamo se il primo argomento della riga di comando è maggiore di 100
- Riga 6 e 7 – Verrà eseguito solo se il test sulla riga 4 restituisce true. Puoi avere tutti i comandi che vuoi qui.
- Riga 6-La barra rovesciata ( \ ) di fronte alla citazione singola ( ‘ ) è necessaria poiché la citazione singola ha un significato speciale per bash e non vogliamo quel significato speciale. Il backslash sfugge al significato speciale per renderlo di nuovo una semplice citazione normale.,
- Linea 8-fi segnala la fine dell’istruzione if. Tutti i comandi dopo questo verranno eseguiti normalmente.
- Riga 10-Poiché questo comando è al di fuori dell’istruzione if, verrà eseguito indipendentemente dal risultato dell’istruzione if.
- . /if_example.sh 15
- Ven 5 Febbraio 9: 06: 30 2021
- ./if_example.sh 150
- Hey questo è un gran numero.
- /home/ryan/bin
- Ven 5 Feb 9:06:30 2021
È sempre buona norma testare i propri script con input che coprano i diversi scenari possibili.,
Test
Le parentesi quadre ( ) nell’istruzione if sopra sono in realtà un riferimento al comando test. Ciò significa che tutti gli operatori che test consente possono essere utilizzati anche qui. Cerca la pagina man per il test per vedere tutti i possibili operatori (ce ne sono alcuni) ma alcuni dei più comuni sono elencati di seguito.
Operatore | Descrizione |
---|---|
! ESPRESSIONE | L’ESPRESSIONE è falsa. |
-n STRING | La lunghezza della STRINGA è maggiore di zero., |
-z STRING | La lunghezza della STRINGA è zero (cioè è vuota). |
STRING1 = STRING2 | STRING1 è uguale a STRING2 |
STRING1 != STRINGA2 | STRINGA1 non è uguale a STRINGA2 |
INTEGER1 -eq INTEGER2 | INTEGER1 è numericamente uguale alla INTEGER2 |
INTEGER1 -gt INTEGER2 | INTEGER1 è numericamente maggiore di INTEGER2 |
INTEGER1 -lt INTEGER2 | INTEGER1 è numericamente meno di INTEGER2 |
-d FILE | FILE esiste ed è una directory., |
-IL FILE | esiste. |
-il FILE r | esiste e viene concesso il permesso di lettura. |
-s FILE | IL FILE esiste e la sua dimensione è maggiore di zero (es. non è vuoto). |
-IL FILE w | esiste e viene concesso il permesso di scrittura. |
-x FILE | IL FILE esiste e viene concesso il permesso di esecuzione. |
Alcuni punti da notare:
- = è leggermente diverso da-eq. restituirà false as = fa un confronto di stringhe (es., carattere per carattere lo stesso) mentre-eq fa un significato di confronto numerico restituirà true.
- Quando ci riferiamo al FILE sopra, in realtà intendiamo un percorso. Ricorda che un percorso può essere assoluto o relativo e può fare riferimento a un file o una directory.
- Perché è solo un riferimento al test di comando possiamo sperimentare e sparare problemi con test sulla riga di comando per assicurarci che la nostra comprensione del suo comportamento sia corretta.
- prova 001 = 1
- eco echo?
- 1
- prova 001-eq 1
- eco echo?,
- 0
- tocca il mio file
- prova il mio file
- echo echo?
- 1
- ls /etc > myfile
- test-s myfile
- echo echo?
- 0
Scomponiamolo:
- Riga 1 – Esegui un confronto basato su stringhe. Il test non stampa il risultato, quindi controlliamo lo stato di uscita che è quello che faremo nella riga successiva.
- Linea 2-La variabile $? mantiene lo stato di uscita del comando eseguito in precedenza (in questo caso test). 0 significa VERO (o successo). 1 = FALSO (o fallimento).,
- Linea 4-Questa volta stiamo eseguendo un confronto numerico.
- Riga 7-Crea un nuovo file vuoto myfile (supponendo che myfile non esista già).
- Linea 8-La dimensione del mio file è maggiore di zero?
- Linea 11-Reindirizzare alcuni contenuti in myfile quindi la sua dimensione è maggiore di zero.
- Linea 12-Testare nuovamente la dimensione del myfile. Questa volta è vero.
Rientro
Noterai che nell’istruzione if sopra abbiamo indentato i comandi che sono stati eseguiti se l’istruzione era vera., Questo è indicato come rientro ed è una parte importante della scrittura di codice buono e pulito (in qualsiasi lingua, non solo script Bash). L’obiettivo è migliorare la leggibilità e rendere più difficile per noi commettere errori semplici e stupidi. Non ci sono regole per quanto riguarda il rientro in Bash, quindi puoi indentare o non indentare come preferisci e i tuoi script continueranno a funzionare esattamente allo stesso modo. Ti consiglio vivamente di indentare il tuo codice comunque (specialmente quando i tuoi script diventano più grandi) altrimenti troverai sempre più difficile vedere la struttura nei tuoi script.,
Istruzioni If nidificate
Parlando di rientro. Ecco un esempio perfetto di quando ti rende la vita più facile. Potresti avere tante istruzioni if necessarie all’interno del tuo script. È anche possibile avere un’istruzione if all’interno di un’altra istruzione if. Ad esempio, potremmo voler analizzare un numero dato sulla riga di comando in questo modo:
Scomponiamolo:
- Riga 4 – Eseguire quanto segue, solo se il primo argomento della riga di comando è maggiore di 100.
- Linea 8-Questa è una leggera variazione sull’istruzione if., Se vogliamo controllare un’espressione, possiamo usare le doppie parentesi come abbiamo fatto per le variabili.
- Riga 10-Viene eseguito solo se entrambe le istruzioni if sono vere.
Yo dawg, ti mandria come dichiarazioni if così ho messo una dichiarazione if all’interno della vostra dichiarazione if.
Xzibit
(Xzibit in realtà non l’ha detto, ma sono sicuro che l’avrebbe fatto, se avesse ospitato Pimp il mio script Bash.,)
Puoi annidare tutte le istruzioni if che vuoi, ma come regola generale se hai bisogno di annidare più di 3 livelli in profondità probabilmente dovresti pensare a riorganizzare la tua logica.
If Else
A volte vogliamo eseguire un certo insieme di azioni se un’istruzione è vera e un altro insieme di azioni se è falsa. Possiamo accogliere questo con il meccanismo else.,
se
quindi
<comandi>
else
<altri comandi>
fi
Ora si può facilmente leggere da un file, se è fornito come argomento della riga di comando, altrimenti leggere da STDIN.
else.sh
- #!/ bin / bash
- # else esempio
- se
- allora
- nl nl 1
- else
- nl/dev/stdin
- fi
Se Elif Else
A volte possiamo avere una serie di condizioni che possono portare a percorsi diversi.,
se
quindi
<comandi>
elif
quindi
<diversi comandi>
else
<altri comandi>
fi
Per esempio può essere il caso che se hai 18 anni o più, si può andare alla festa. Se non lo sei, ma hai una lettera dai tuoi genitori si può andare, ma deve essere di nuovo prima di mezzanotte. Altrimenti non puoi andare.
Puoi avere tutti i rami elif che vuoi. L’altro finale è anche opzionale.,
Operazioni booleane
A volte vogliamo fare qualcosa solo se sono soddisfatte più condizioni. Altre volte vorremmo eseguire l’azione se una delle diverse condizioni è soddisfatta. Siamo in grado di ospitare questi con operatori booleani.
- e – &&
- o – |/
Per esempio forse vogliamo solo eseguire un’operazione se il file è leggibile e ha una dimensione maggiore di zero.
and.sh
- #!,/ bin / bash
- # ed esempio
- se&&
- allora
- echo Questo file è utile.
- fi
Forse vorremmo eseguire qualcosa di leggermente diverso se l’utente è bob o andy.
or.sh
- #!/ bin / bash
- # o esempio
- if | /
- then
- ls-alh
- else
- ls
- fi
Case Statements
A volte potremmo voler prendere percorsi diversi basati su una variabile che corrisponde a una serie di pattern., Potremmo usare una serie di dichiarazioni if ed elif, ma che presto diventerebbero poco resistenti. Fortunatamente c’è una dichiarazione del caso che può rendere le cose più pulite., It’s a little hard to explain so here are some examples to illustrate:
case <variable> in
<pattern 1>)
<commands>
;;
<pattern 2>)
<other commands>
;;
esac
Here is a basic example:
case.sh
- #!,/bin/bash
- # esempio di caso
- case $1 in
- start)
- echo avvio
- ;;
- stop)
- echo stoping
- ;;
- riavviare)
- echo riavvio
- ;;
- *)
- echo don\’t sapere
- ;;
- esac
rompere verso il basso:
- Linea 4 – Questa linea inizia il casemechanism.
- Riga 5-Se $1 è uguale a ‘start’, esegui le azioni successive. il) indica la fine del modello.,
- Riga 7-Identifichiamo la fine di questo insieme di istruzioni con un doppio punto e virgola ( ;; ). A seguito di questo è il prossimo caso da considerare.
- Linea 14-Ricordate che il test per ogni caso è un modello. * rappresenta un numero qualsiasi di qualsiasi carattere. E ‘ essentialy una cattura tutti se per se nessuno degli altri casi corrispondono. Non è necessario ma è spesso usato.
- Riga 17-esac è case backwards e indica che siamo alla fine dell’istruzione case. Qualsiasi altra istruzione dopo questo verrà eseguita normalmente.
- . /case.sh avvio
- avvio
- .,/case.sh riavviare
- riavviare
- . / case.sh blah
- non so
Ora diamo un’occhiata a un esempio leggermente più complesso in cui i pattern vengono usati un po ‘ di più.
Sommario
Attività
Ora prendiamo alcune decisioni.
- Crea uno script Bash che prenderà 2 numeri come argomenti della riga di comando. Stamperà sullo schermo il più grande dei due numeri.,
- Crea uno script Bash che accetterà un file come argomento della riga di comando e lo analizzerà in determinati modi. ad es. è possibile verificare se il file è eseguibile o scrivibile. Dovresti stampare un certo messaggio se vero e un altro se falso.
- Crea uno script Bash che stamperà un messaggio in base al giorno della settimana (ad es. ‘Happy hump day’ per Wedensday, ‘TGIF’ per venerdì ecc).