Ciao! Abbiamo già trattato le basi dello scripting della shell come accettare input, elaborare dati tramite operazioni aritmetiche e generare e visualizzare output nelle parti precedenti di questo tutorial (parte 1 e parte 2). In questa parte, approfondiremo un argomento più avanzato in un linguaggio di programmazione:prendere decisioni in un programma, ma questa volta lo faremo usando la shell bash. Iniziamo!
Introduzione
La maggior parte dei nostri linguaggi di programmazione oggi è in grado di prendere decisioni in base alle condizioni che impostiamo. Una condizione è un'espressione che restituisce un valore booleano, vero o falso. Qualsiasi programmatore può rendere intelligente il suo programma in base alla decisione e alla logica che inserisce nel suo programma. La shell bash supporta le istruzioni decisionali if e switch (case).
Dichiarazione If
If è un'istruzione che consente al programmatore di prendere una decisione nel programma in base alle condizioni da lui specificate. Se la condizione è soddisfatta, il programma eseguirà determinate righe di codice, altrimenti il programma eseguirà altre attività specificate dal programmatore. Quella che segue è la sintassi supportata dell'istruzione if nella shell bash.
Sintassi generale
Decisione unica:
if <condition>
then
### series of code goes here
fi
Doppia decisione:
if <condition>
then
### series of code if the condition is satisfied
else
### series of code if the condition is not satisfied
fi
Condizione multipla se:
if <condition1>
then
### series of code for condition1
elif <condition2>
then
### series of code for condition2
else
### series of code if the condition is not satisfied
fi
Sintassi a parentesi singola
if [ condition ]
then
### series of code goes here
fi
Sintassi tra parentesi quadre
if ((condition))
then
### series of code goes here
fi
La sintassi a parentesi singola è la più vecchia sintassi supportata nella shell bash. Viene utilizzato insieme a tutte le istruzioni condizionali in Linux. Nel frattempo, la sintassi della doppia parentesi viene utilizzata per un'istruzione condizionale basata su numeri per fornire una sintassi familiare ai programmatori. Tutti i tipi di istruzioni if richiedono una condizione specificata per eseguire un'attività.
Dichiarazioni condizionali in Linux
Le istruzioni condizionali vengono utilizzate insieme a un'istruzione di controllo delle decisioni. Esistono diversi tipi di istruzioni condizionali che puoi utilizzare nella shell bash, le più comuni sono:condizioni basate su file, basate su stringhe e basate su aritmetica.
Condizione basata su file
Le condizioni basate su file sono espressioni unarie e spesso utilizzate per esaminare lo stato di un file. L'elenco seguente mostra le condizioni basate su file più comunemente utilizzate nella shell bash.
Operatore | Descrizione |
-un file | Restituisce true se il file esiste |
file -b | Restituisce true se il file esiste ed è un file speciale di blocco |
-c file | Restituisce true se il file esiste ed è un file di caratteri speciali |
-d file | Restituisce true se il file esiste ed è una directory |
-e file | Restituisce true se il file esiste |
file -r | Restituisce true se il file esiste ed è leggibile |
file -s | Restituisce true se il file esiste e ha una dimensione maggiore di zero |
file -s | Restituisce true se il file esiste e ha una dimensione maggiore di zero |
-w file | Restituisce true se il file esiste ed è scrivibile |
-x file | Restituisce true se il file esiste ed è eseguibile |
-N file | Restituisce true se il file esiste ed è stato modificato dall'ultima lettura |
Prendere una decisione basata su file
Facciamo un esempio che illustrerà come costruire una decisione basata su file in uno script bash. In questo esempio creeremo uno script che determina se il file esiste nella home directory.
#!/bin/bash
cd
ls
if [ -e sample.sh ]
then
echo "file exists!"
else
echo "file does not exist"
fi
In questo esempio, ci siamo assicurati che la shell tornerà alla home directory indipendentemente dalla nostra directory attiva corrente utilizzando il comando cd. Inoltre, il comando ls viene utilizzato per mostrare l'elenco dei file nella directory per consentirci di verificare l'esistenza o meno del file. Come puoi vedere, lo script emette il testo "il file esiste!" perché sample.sh si trova nella home directory.
Note: The shell compiler is very strict in terms of syntax especially with spaces. There should be a space between if and the open bracket and in between brackets and the condition.
Ora miglioriamo il nostro script rendendo il nostro codice più dinamico consentendo all'utente di inserire un nome di script e determinare i permessi del file specificato.
#!/bin/bash
cd
ls -l
read -p "Enter a file name: " filename
if [ -e $filename ]
then
echo "file exists!"
if [ -r $filename ]
then
status="readable "
fi
if [ -w $filename ]
then
status=$status"writable "
fi
if [ -x $filename ]
then
status=$status"executable"
fi
echo "file permission: "$status
else
echo "file does not exist"
fi
Condizione basata su stringhe
Prendere decisioni basate su una stringa di input dell'utente è possibile anche nella shell bash. La condizione basata su stringa restituisce un'espressione binaria come risultato, restituisce true se la condizione specificata è soddisfatta, altrimenti restituisce false. I seguenti sono gli operatori condizionali basati su stringhe comunemente usati:
Operatore | Descrizione |
== | Restituisce true se le stringhe sono uguali |
!= | Restituisce true se le stringhe non sono uguali |
-n | Restituisce true se la stringa da testare non è nulla |
-z | Restituisce true se la stringa da testare è nulla |
Creiamo uno script di esempio utilizzando un'istruzione condizionale basata su stringhe. Lo script consentirà all'utente di inserire due stringhe e valutare se una delle stringhe è nulla, entrambe le stringhe sono uguali e non uguali.
#!/bin/bash
read -p "First String: " str1
read -p "Second String: " str2
if [ -z "$str1" ]
then
echo "The 1st string is null"
elif [ -z "$str2" ]
then
echo "The 2nd string is null"
else
if [ $str1 == $str2 ]
then
echo "The strings are equal"
else
echo "The strings are not equal"
fi
fi
Condizione basata sull'aritmetica
La shell fornisce diversi modi per dichiarare una condizione basata sull'aritmetica. Il primo è utilizzare mnemonici che possono essere utilizzati insieme alla sintassi della parentesi singola vecchio stile e l'altro utilizza simboli compatibili con la matematica che possono essere utilizzati insieme alla doppia parentesi
Di seguito è riportato l'elenco dei mnemonici disponibili per le istruzioni condizionali basate sull'aritmetica nella shell:
Operatore | Utilizzo/Descrizione |
-eq | Uguale |
-ge | Maggiore o uguale a |
-gt | Maggiore di |
-le | Inferiore o uguale a |
-lt | Meno di |
-ne | Non uguale |
Creiamo uno script che accetti un numero intero dall'utente e determini se il numero intero è zero, negativo, dispari o pari.
#!/bin/bash
read -p "Enter an integer: " int1
if [ $int1 -eq 0 ]
then
echo "Zero"
elif [ $int1 -lt 0 ]
then
echo "Negative"
else
if [ $((int1%2)) -eq 0 ]
then
echo "Even"
else
echo "Odd"
fi
fi
Operatore aritmetico per la sintassi tra parentesi doppie:
Operatore | Utilizzo/Descrizione |
== | Uguale |
>= | Maggiore o uguale a |
> | Maggiore di |
<= | Inferiore o uguale a |
< | Meno di |
!= | Non uguale |
Ora, ricostruiamo il nostro script precedente e usiamo la sintassi tra parentesi doppie:
#!/bin/bash
read -p "Enter an integer: " int1
if (( $int1 == 0 ))
then
echo "Zero"
elif (( $int1 < 0 ))
then
echo "Negative"
else
if (( $((int1%2)) == 0 ))
then
echo "Even"
else
echo "Odd"
fi
fi
Dichiarazione di commutazione
L'istruzione switch è un altro tipo di istruzione condizionale nello scripting della shell. Consente a un programmatore di confrontare diversi valori con una variabile in un modo più semplice rispetto all'istruzione if condizionale. La sintassi per l'istruzione switch è:
casein
<pattern1>)
##series of code for pattern1
;;
<pattern2>)
##series of code for pattern2
;;
<patternN>)
##series of code for patternN
;;
*)
##default statements
esac
Il pattern è il possibile valore della variabile. Ogni modello è separato da un doppio punto e virgola che funge da istruzione di interruzione del modello. L'istruzione switch viene chiusa con un'istruzione esac.
#!/bin/bash
clear
read -p "Integer1: " int1
read -p "Integer2: " int2
echo "======================"
printf "Menu: \n[a] Addition\n[b]Subtraction\n[c]Multiplication\n[d]Division\n"
echo "======================"
read -p "Your choice: " choice
res=0
case $choice in
a)
res=$((int1+int2))
;;
b)
res=$((int1-int2))
;;
c)
res=$((int1*int2))
;;
d)
res=$((int1/int2))
;;
*)
echo "Invalid input"
esac
echo "The result is: " $res
Conclusione
La shell bash fornisce molti strumenti utili per i programmatori. Proprio come la maggior parte dei linguaggi di programmazione oggi, è anche in grado di prendere decisioni condizionali che rendono gli script di shell più interattivi e intelligenti. Presenteremo una struttura di controllo ripetitiva nella prossima serie. Alla prossima volta.
Riferimenti
- http://www.gnu.org/software/bash/manual/html_node/Bash-Conditional-Expressions.html
- https://linuxacademy.com/blog/linux/conditions-in-bash-scripting-if-statements/
La prossima lezione: strutture di controllo della ripetizione