GNU/Linux >> Linux Esercitazione >  >> Linux

Bash Beginner Series #7:Decision Making With If Else e Case Statements

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.


Linux
  1. Come programmare con Bash:sintassi e strumenti

  2. Navigazione nella shell Bash con pushd e popd

  3. Bash Beginner Series #9:Utilizzo delle funzioni in Bash

  4. Bash Beginner Series #8:Loop in Bash

  5. Distribuzione Linux con solo busybox e bash?

Bash Beginner Series #5:Utilizzo di operatori aritmetici negli script Bash

Bash Beginner Series #4:Utilizzo di array in Bash

Bash Beginner Series #3:Passare argomenti agli script Bash

Bash Beginner Series #6:Operazioni con le stringhe in Bash

Bash Beginner Series #10:Automazione con Bash

Comprendere Bash If Else e altre dichiarazioni condizionali