Se hai mai scritto uno script Bourne Again Shell (Bash), sai che possono diventare rapidamente complessi man mano che aggiungi più logica. Come evitare di rovinare i tuoi script? Le istruzioni condizionali, come Bash se altro, sono un modo per aggiungere logica, consentendo al tuo script di prendere decisioni in base a determinate condizioni.
In questo tutorial imparerai come utilizzare le istruzioni if-else e case di Bash per scrivere uno script Bash privo di errori. Tutto questo con alcune best practice per la scrittura di script Bash.
Pronto? Continua a leggere e porta il tuo scripting Bash al livello successivo!
Prerequisiti
Questo tutorial sarà una dimostrazione pratica. Se vuoi seguire, assicurati di averlo
- Un sistema Linux o Windows con Bash installato:il sottosistema Windows per Linux (WSL) è un'opzione eccellente per gli utenti Windows.
- Un editor di codice/testo.
Perché utilizzare le dichiarazioni condizionali?
Le istruzioni condizionali sono uno degli strumenti più importanti nello scripting Bash in quanto ti consentono di prendere decisioni nei tuoi script in base a determinate condizioni.
Ad esempio, puoi utilizzare un'istruzione condizionale per verificare se un file esiste prima di provare a eliminarlo. Oppure potresti usarne uno per verificare se un utente ha il permesso di accedere a una determinata risorsa.
Le istruzioni condizionali rendono i tuoi script più flessibili e potenti. Immagina di scrivere uno script per eliminare tutti i file in una directory. Con un'istruzione condizionale, puoi eliminare file più vecchi di 30 giorni.
Comprendere la dichiarazione IF
Basta con l'introduzione allo script Bash e sporcarsi le mani. Dai un'occhiata più da vicino a una delle istruzioni condizionali più popolari, il if
dichiarazione.
Il if
istruzione è il modo più semplice per aggiungere condizionali ai tuoi script Bash, con la seguente sintassi:
- A partire dalla parola chiave if, specifichi le [[condizioni]] da soddisfare. Il codice all'interno dell'istruzione if viene quindi eseguito e l'istruzione termina con la parola chiave fi.
- La parola chiave then separa la condizione dal codice (istruzione) che verrà eseguito se la condizione viene soddisfatta. Questo codice può essere lungo più righe se aggiungi un punto e virgola (;) come separatore di riga.
if [[ condition ]]; then
statement
fi
Supponiamo che tu stia creando uno script che richiede il nome utente corretto per il tuo sistema prima di accedere:
1. Apri il tuo terminale e crea un nuovo bash_if_demo.sh file utilizzando il tuo editor di testo preferito.
nano bash_if_demo.sh
2. Copia e incolla il seguente codice nel tuo bash_if_demo.sh file, salva le modifiche e chiudi il file.
Il codice sottostante richiede un nome utente e, se viene inserito quello corretto, il codice stampa un messaggio di "bentornato" insieme alla data e all'ora correnti.
Puoi registrare la data e l'ora in cui l'utente sta tentando di accedere al sistema per ulteriori analisi.
La prima riga #!/bin/bash (shebang) dice al sistema quale interprete utilizzare per eseguire il resto del codice nel file. In questo caso, stai usando bash.
#!/bin/bash
# Prints a question to the screen.
echo "Whats your name?"
# Reads keyboard input and stores it in the $NAME variable
read NAME
# Starts the if statement - checks to see if the $NAME variable's value
# is equal to ATA. If it is, the code inside runs. Otherwise, the code will not run.
if [ $NAME == "ATA" ]
then
# Prints a message to the screen, only if the value stored in the $NAME variable
# is equal to ATA.
echo "Welcome back ATA!"
fi
# Prints the current date and time to the screen. Since this line is outside
# of the if statement, it always runs regardless of the $NAME variable's value.
date
3. Infine, esegui il comando seguente per eseguire lo script bash_if_demo.sh per vedere cosa fa.
bash bash_if_demo.sh
Nota che qualunque shell Bash stai usando, devi aggiungere bash prima del nome dello script, in modo che il sistema utilizzi Bash per eseguire il tuo codice.
Inserisci ATA, quindi premi Invio e vedrai il seguente output.
Non riceverai il messaggio di benvenuto se inserisci qualcosa di diverso da "ATA.", solo la data e l'ora correnti. Come mai? Perché la tua istruzione if sta verificando il valore esatto di quello memorizzato nella variabile $NAME.
Si noti che le istruzioni if fanno distinzione tra maiuscole e minuscole. Quindi, "ata", "aTa", "Ata" ecc. non sono la stessa cosa di "ATA".
Testare il codice con input diversi è una procedura consigliata per assicurarsi che il codice si comporti come previsto.
Comprendere le dichiarazioni Nested If
Hai appena imparato le basi della scrittura di istruzioni if, e questo è abbastanza buono se non stai scrivendo un codice complesso. Ma se lo fai, prova a scrivere un'istruzione if annidata per espandere le tue dichiarazioni condizionali. Un'istruzione if annidata è un'istruzione if che contiene una o più istruzioni if.
Di seguito è riportata la sintassi di base per le istruzioni nidificate if, dove:
if [[ conditions ]]
– Ilif
esterno istruzione contenente codice che viene eseguito solo se la condizione è soddisfatta. In questo caso, un altroif
dichiarazione).if [[ condition2 ]]
– Ilif
interno istruzione contenente codice che viene eseguito solo se vengono soddisfatte entrambe le condizioni.
if [[ conditions
]]; then
if [[ condition2 ]]; then
statement
fi
fi
Migliorare il codice precedente impostando un if
dichiarazione che richiede una password:
1. Crea un nuovo file chiamato bash_nested_if_demo.sh con il tuo editor di testo.
nano bash_nested_if_demo.sh
2. Compila il codice seguente in bash_nested_if_demo.sh file, salva le modifiche e chiudi il file.
Il codice sottostante richiede un nome e una password. Se entrambe le condizioni sono soddisfatte per il nome e la password, il codice stampa un messaggio. In caso contrario, il codice non stamperà alcun messaggio a parte la data e l'ora correnti.
#!/bin/bash
# Prints a message asking for a name.
echo "Whats your name?"
# Reads input from the keyboard.
read NAME
# Check if the $NAME variable's value is equal to "ATA."
if [ $NAME == "ATA" ]
then
# Prints a message asking for a password.
echo "Password"
# Reads input from the keyboard.
read Password
# Nested if statement - Check if the $Password variable's value equals "pwd123."
if [ "$Password" == "pwd123" ]; then
# Prints a message if both conditions for name and password are met.
echo "You logged in as ATA"
fi
fi
# Prints the current date and time
date
3. Infine, esegui il comando seguente per eseguire bash_nested_if_demo.sh copione.
bash bash_nested_if_demo.sh
Inserisci ATA per il nome e pwd123 per la password.
Se inserisci qualcosa di diverso da "ATA" o "pwd123", l'unico messaggio che riceverai sarà la data e l'ora correnti. Come mai? Entrambe le condizioni nelle tue istruzioni nidificate if devono essere soddisfatte.
Comprendere le dichiarazioni IF ELSE
L'istruzione if è uno strumento potente e comunemente usato negli script Bash. se le dichiarazioni possono aiutare a prendere decisioni nei tuoi script. Ma vale la pena notare che ci sono alcuni svantaggi nell'usare le istruzioni if.
Lo svantaggio principale è che le istruzioni if possono rendere difficile la lettura e la manutenzione del codice, specialmente se hai annidato istruzioni if all'interno di altre istruzioni if. Questo stile di scripting può portare a quello che è noto come "codice spaghetti", difficile da leggere e capire.
Quindi, come fai a rendere il tuo codice non complicato? Usa le istruzioni if else invece di un gruppo di istruzioni if annidate. La parola chiave else consente di specificare il codice che verrà eseguito se la condizione nell'istruzione if non viene soddisfatta.
Esamina la sintassi dell'istruzione IF ELSE di seguito, dove:
if [[ conditions ]]
– Ilif
istruzione, che contiene il codice (statement1
) che verrà eseguito se la condizione è soddisfatta.else
– Ilelse
contiene il codice (statement2
) che verrà eseguito se la condizione nelif
dichiarazione non è soddisfatta.
if [[ conditions ]]; then
statement1
else
statement2
fi
Supponiamo che tu stia creando un gioco di numeri, che accetta un numero casuale come input dall'utente:
1. Crea un nuovo file chiamato bash_if_else_demo.sh.
nano bash_if_else_demo.sh
2. Aggiungi il seguente codice al tuo bash_if_else_demo.sh file, salva le modifiche e chiudi il file.
Il codice seguente stampa un messaggio che richiede il numero fortunato dell'utente e stampa il messaggio Hai vinto se l'input dell'utente è un numero pari. In caso contrario (altrimenti), il codice stampa il messaggio You Lost se l'inserimento dell'utente è un numero dispari.
#!/bin/bash
# Prints a message asking for the user's lucky number
echo -n "Enter You Lucky Number:"
# Reads the keyboard input.
read var
# Checks if the value is an even number.
if [ $((var%2)) == 0 ]; then
# Prints a message if the condition is met
echo "You Won!"
else
# Prints a message if the condition is not met
echo "You Lost!"
fi
3. Ora esegui il seguente comando per eseguire lo script bash_if_else_demo.sh.
bash bash_if_else_demo.sh
Se inserisci un numero pari, viene visualizzato il messaggio "Hai vinto!" stampe, come puoi vedere di seguito. Ma se inserisci un numero dispari, il messaggio "Hai perso!" stampa invece.
Prova a migliorare il tuo codice aggiungendo un'altra istruzione che controlla se l'utente inserisce invece una lettera di un carattere speciale.
Comprendere le dichiarazioni del caso
Finora, hai esaminato due modi per prendere decisioni nei tuoi script Bash:if
dichiarazioni e else
dichiarazioni. Ma c'è un altro modo per prendere decisioni nei tuoi script, il case
dichiarazione.
Il case
è simile al if
istruzione in quanto consente di specificare il codice che verrà eseguito in base a una condizione. Ma la cosa buona dell'istruzione case è che avrai una sintassi più precisa e concisa rispetto al if
annidato dichiarazione.
La sintassi per l'istruzione case è la seguente dove:
case $VAR in
– Ilcase
istruzione che accetta il$VAR
la variabile verifica i modelli specificati finché non viene trovata una corrispondenza.pattern1)
epattern2)
-I modelli da testare, che esegue il codice (statement1
ostatement2
) una volta trovato un modello.esac
– Termina la dichiarazione del caso.
case $VAR in
pattern1)
statement1
;;
pattern2)
statement2
;;
esac
Supponiamo di aver bisogno di uno script che chieda agli utenti di inserire i nomi dei loro paesi e di rispondere con un messaggio che mostra la lingua parlata in quel paese.
1. Crea un nuovo file chiamato bash_case_demo.sh.
nano bash_case_demo.sh
2. Compila il codice seguente in bash_case_demo.sh file, salva le modifiche e chiudi il file.
Il codice seguente richiede all'utente il nome di un paese e stampa la lingua ufficiale di quel paese in base agli schemi in una dichiarazione del caso.
3#!/bin/bash
# Prints a message asking for the user's country name
echo -n "Enter the Country You Live In:"
# Reads keyboard input.
read var
# Prints a message showing the official language in the user's country ($var)
# based on the pattern in the case statement.
echo -n "The official language of $var is "
# Case statement - checks if the user's input ($var) matches the patterns.
case $var in
# Define patterns that print the user's country's official language.
US)
echo -n "English"
;;
Canada)
echo -n "English | French"
;;
Algeria | Bahrain | Egypt| Jordan)
echo -n "Arabic"
;;
*)
echo -n "unknown"
;;
esac
3. Infine, esegui il comando seguente per eseguire lo script bash_case_demo.sh.
bash bash_case_demo.sh
Di seguito, puoi vedere che viene stampata la lingua ufficiale appropriata in base al paese inserito dall'utente.
Se il paese inserito non corrisponde a nessuno dei modelli, viene utilizzato il modello predefinito (*) e viene stampato il messaggio sconosciuto.
Conclusione
In questo tutorial, hai fatto i primi passi per imparare a usare le istruzioni condizionali in Bash. Hai imparato a semplificare il codice complesso con l'istruzione if di Bash, l'istruzione if-else e l'istruzione case.
Ora sei abbastanza sicuro da usare le istruzioni condizionali per scrivere script Bash in modo più efficiente e con meno errori.
Ma non fermarti qui! Ci sono più cose che le dichiarazioni condizionali in Bash possono offrire. Forse inizia a conoscere l'istruzione Bash elif e &&, OR e || operatori? Con un po' di pratica, scriverai script Bash come un professionista in pochissimo tempo!