Rendiamo intelligenti i nostri script bash!
In questa parte della serie per principianti di bash, imparerai come utilizzare le istruzioni condizionali nei tuoi script bash per far sì che si comportino in modo diverso in diversi scenari e casi.
In questo modo puoi creare script bash molto più efficienti e puoi anche implementare il controllo degli errori nei tuoi script.
Utilizzo dell'istruzione if in bash
Il costrutto più fondamentale in qualsiasi struttura decisionale è una condizione if. La sintassi generale di un'istruzione if di base è la seguente:
if [ condition ]; then
your code
fi
Il if
l'istruzione è chiusa con un fi
(inverso di se).
Fai attenzione allo spazio bianco!
- Deve esserci uno spazio tra le parentesi di apertura e chiusura e la condizione che scrivi. In caso contrario, la shell si lamenterà dell'errore.
- Deve esserci spazio prima e dopo l'operatore condizionale (=, ==, <=ecc.). In caso contrario, visualizzerai un messaggio di errore come "previsto operatore unario".
Ora creiamo uno script di esempio root.sh. Questo script farà eco all'affermazione "sei root" solo se esegui lo script come utente root:
#!/bin/bash
if [ $(whoami) = 'root' ]; then
echo "You are root"
fi
Il whoami
comando restituisce il nome utente. Dal tutorial sulle variabili bash, sai che $(command)
la sintassi viene utilizzata per la sostituzione dei comandi e fornisce l'output del comando.
La condizione $(whoami) = 'root'
sarà vero solo se hai effettuato l'accesso come utente root.
Non mi credi? Non devi. Eseguilo e guardalo di persona.
Utilizzo dell'istruzione if-else in bash
Potresti aver notato che non ottieni alcun output quando esegui root.sh script come utente normale. Qualsiasi codice che desideri eseguire quando una condizione if viene valutata come falsa può essere incluso in un'istruzione else come segue:
#!/bin/bash
if [ $(whoami) = 'root' ]; then
echo "You are root"
else
echo "You are not root"
fi
Ora, quando esegui lo script come utente normale, ti verrà ricordato che non sei l'onnipotente utente root:
[email protected]:~$ ./root.sh
You are not root
Utilizzo dell'istruzione else if in bash
È possibile utilizzare un'istruzione elif (else-if) ogni volta che si desidera testare più di un'espressione (condizione) contemporaneamente.
Ad esempio, il seguente age.sh bash script prende la tua età come argomento e genererà un messaggio significativo che corrisponde alla tua età:
#!/bin/bash
AGE=$1
if [ $AGE -lt 13 ]; then
echo "You are a kid."
elif [ $AGE -lt 20 ]; then
echo "You are a teenager."
elif [ $AGE -lt 65 ]; then
echo "You are an adult."
else
echo "You are an elder."
fi
Ora esegui alcune esecuzioni di age.sh script da testare con età diverse:
[email protected]:~$ ./age.sh 11
You are a kid.
[email protected]:~$ ./age.sh 18
You are a teenager.
[email protected]:~$ ./age.sh 44
You are an adult.
[email protected]:~$ ./age.sh 70
You are an elder.
Nota che ho usato -lt
(minore di) condizione di test con la variabile $AGE.
Tieni inoltre presente che puoi avere più elif
dichiarazioni ma solo un else
in un costrutto if e deve essere chiuso con un fi
.
Utilizzo di istruzioni if annidate in bash
Puoi anche usare un'istruzione if all'interno di un'altra istruzione if. Ad esempio, dai un'occhiata al seguente weather.sh script bash:
#!/bin/bash
TEMP=$1
if [ $TEMP -gt 5 ]; then
if [ $TEMP -lt 15 ]; then
echo "The weather is cold."
elif [ $TEMP -lt 25 ]; then
echo "The weather is nice."
else
echo "The weather is hot."
fi
else
echo "It's freezing outside ..."
fi
Lo script prende qualsiasi temperatura come argomento e quindi visualizza un messaggio che riflette come sarebbe il tempo. Se la temperatura è maggiore di cinque, viene valutata l'istruzione if-elif annidata (interna). Eseguiamo alcune esecuzioni dello script per vedere come funziona:
[email protected]:~$ ./weather.sh 0
It's freezing outside ...
[email protected]:~$ ./weather.sh 8
The weather is cold.
[email protected]:~$ ./weather.sh 16
The weather is nice.
[email protected]:~$ ./weather.sh 30
The weather is hot.
Utilizzo dell'istruzione Case in bash
Puoi anche utilizzare le istruzioni case in bash per sostituire più istruzioni if poiché a volte sono confuse e difficili da leggere. La sintassi generale di un costrutto case è la seguente:
case "variable" in
"pattern1" )
Command … ;;
"pattern2" )
Command … ;;
"pattern2" )
Command … ;;
esac
Fai attenzione!
- Gli schemi sono sempre seguiti da uno spazio vuoto e da
)
. - I comandi sono sempre seguiti dal doppio punto e virgola
;;
. Lo spazio bianco non è obbligatorio prima di esso. - Le istruzioni del caso terminano con
esac
(rovescio delle maiuscole).
Le istruzioni Case sono particolarmente utili quando si ha a che fare con la corrispondenza di modelli o le espressioni regolari. Per dimostrare, dai un'occhiata al seguente char.sh script bash:
#!/bin/bash
CHAR=$1
case $CHAR in
[a-z])
echo "Small Alphabet." ;;
[A-Z])
echo "Big Alphabet." ;;
[0-9])
echo "Number." ;;
*)
echo "Special Character."
esac
Lo script prende un carattere come argomento e mostra se il carattere è un alfabeto piccolo/grande, un numero o un carattere speciale.
[email protected]:~$ ./char.sh a
Small Alphabet.
[email protected]:~$ ./char.sh Z
Big Alphabet.
[email protected]:~$ ./char.sh 7
Number.
[email protected]:~$ ./char.sh $
Special Character.
Si noti che ho utilizzato il simbolo jolly asterisco (*) per definire il caso predefinito che è l'equivalente di un'istruzione else in una condizione if.
Condizioni di prova in bash
Esistono numerose condizioni di test che è possibile utilizzare con le istruzioni if. Le condizioni del test variano se si lavora con numeri, stringhe o file. Considerali come operatori logici in bash.
Ho incluso alcune delle condizioni di test più popolari nella tabella seguente:
Condizione | Equivalente |
---|---|
$a -lt $b | $a <$b |
$a -gt $b | $a> $b |
$a -le $b | $a <=$b |
$a -ge $b | $a>=$b |
$a -eq $b | $a è uguale a $b |
$a -ne $b | $a non è uguale a $b |
-e $FILE | $FILE esiste |
-d $FILE | $FILE esiste ed è una directory. |
-f $FILE | $FILE esiste ed è un file normale. |
-L $FILE | $FILE esiste ed è un collegamento software. |
$STRINGA1 =$STRINGA2 | $STRING1 è uguale a $STRING2 |
$STRINGA1 !=$STRINGA2 | $STRING1 non è uguale a $STRING2 |
-z $STRING1 | $STRING1 è vuoto |
Fortunatamente, non è necessario memorizzare nessuna delle condizioni del test perché puoi cercarle nella pagina man del test:
[email protected]:~$ man test
Creiamo uno script finale chiamato filetype.sh che rileva se un file è un file normale, una directory o un collegamento software:
#!/bin/bash
if [ $# -ne 1 ]; then
echo "Error: Invalid number of arguments"
exit 1
fi
file=$1
if [ -f $file ]; then
echo "$file is a regular file."
elif [ -L $file ]; then
echo "$file is a soft link."
elif [ -d $file ]; then
echo "$file is a directory."
else
echo "$file does not exist"
fi
Ho migliorato leggermente lo script aggiungendo un controllo sul numero di argomenti. Se non ci sono argomenti o più di un argomento, lo script genererà un messaggio e uscirà senza eseguire il resto delle istruzioni nello script.
Eseguiamo alcune esecuzioni dello script per testarlo con vari tipi di file:
[email protected]:~$ ./filetype.sh weather.sh
weather.sh is a regular file.
[email protected]:~$ ./filetype.sh /bin
/bin is a soft link.
[email protected]:~$ ./filetype.sh /var
/var is a directory.
[email protected]:~$ ./filetype.sh
Error: Invalid number of arguments
Bonus:istruzione Bash if else in una riga
Finora tutte le istruzioni if else che hai visto sono state utilizzate in un vero script bash. Questo è il modo decente di farlo, ma non sei obbligato a farlo.
Quando vuoi solo vedere il risultato nella shell stessa, puoi usare le istruzioni if else in una singola riga in bash.
Supponiamo di avere questo script bash.
if [ $(whoami) = 'root' ]; then
echo "You are root"
else
echo "You are not root"
fi
Puoi usare tutte le istruzioni if else in una singola riga come questa:
if [ $(whoami) = 'root' ]; then echo "root"; else echo "not root"; fi
Puoi copiare e incollare quanto sopra nel terminale e vedere il risultato di persona.
Fondamentalmente, aggiungi semplicemente un punto e virgola dopo i comandi e quindi aggiungi la successiva istruzione if-else.
Eccezionale! Questo dovrebbe darti una buona comprensione delle affermazioni condizionali in Bash. Spero che ti sia piaciuto rendere i tuoi script bash più intelligenti!
Puoi testare le tue conoscenze appena apprese praticando alcuni semplici esercizi bash nel PDF qui sotto. Include anche la soluzione.
Bash Capitolo 7 Domande pratiche Problemi e la loro soluzione per mettere in pratica ciò che hai appena appreso in questo capitolo Bash-Capitolo-7-Domande pratiche-Linux-Handbook.pdf31 KB
Resta sintonizzato per la prossima settimana poiché imparerai a utilizzare vari costrutti di loop nei tuoi script bash.