Introduzione
In questo tutorial, tratteremo le basi del costrutto select
in Bash.
Il costrutto select
ti consente di generare menu.
Il costrutto Select in Bash
Il costrutto select
genera un menu da un elenco di elementi. Ha quasi la stessa sintassi del loop for
:
select ITEM in [LIST]
do
[COMMANDS]
done
Il parametro [LIST]
può essere una serie di stringhe separate da spazi, un intervallo di numeri, output di un comando, un array, e così via. È possibile impostare un prompt personalizzato per il costrutto select
utilizzando la variabile di ambiente PS3
.
Quando viene invocato il costrutto select
, ogni elemento dell'elenco viene stampato sullo schermo (errore standard), preceduto da un numero.
Se l'utente inserisce un numero corrispondente al numero di uno degli elementi visualizzati, il valore di [ITEM]
viene impostato su quell'elemento. Il valore dell'elemento selezionato è memorizzato nella variabile REPLY
. Altrimenti, se l'input dell'utente è vuoto, il prompt e l'elenco dei menu vengono nuovamente visualizzati.
Il ciclo select
continuerà a essere eseguito e richiederà l'input dell'utente fino all'esecuzione del comando break
.
Per dimostrare come funziona il costrutto select
, diamo un'occhiata al seguente semplice esempio:
PS3="Enter a number: "
select character in Sheldon Leonard Penny Howard Raj
do
echo "Selected character: $character"
echo "Selected number: $REPLY"
done
Lo script visualizzerà un menu composto da voci di elenco con un numero di accompagnamento e il prompt PS3
. Quando l'utente inserisce un numero, lo script stampa il carattere e il numero selezionati:
1) Sheldon
2) Leonard
3) Penny
4) Howard
5) Raj
Enter a number: 3
Selected character: Penny
Selected number: 3
Enter a number:
Esempio di Select in Bash
Di solito, select
viene utilizzato in combinazione con case
o con dichiarazioni if
.
Diamo un'occhiata a un esempio più pratico. È un semplice calcolatore che richiede all'utente l'immissione ed esegue operazioni aritmetiche di base come addizione, sottrazione, moltiplicazione e divisione.
PS3="Select the operation: "
select opt in add subtract multiply divide quit; do
case $opt in
add)
read -p "Enter the first number: " n1
read -p "Enter the second number: " n2
echo "$n1 + $n2 = $(($n1+$n2))"
;;
subtract)
read -p "Enter the first number: " n1
read -p "Enter the second number: " n2
echo "$n1 - $n2 = $(($n1-$n2))"
;;
multiply)
read -p "Enter the first number: " n1
read -p "Enter the second number: " n2
echo "$n1 * $n2 = $(($n1*$n2))"
;;
divide)
read -p "Enter the first number: " n1
read -p "Enter the second number: " n2
echo "$n1 / $n2 = $(($n1/$n2))"
;;
quit)
break
;;
*)
echo "Invalid option $REPLY"
;;
esac
done
Quando lo script viene eseguito, visualizza il menu e il prompt PS3
. All'utente viene richiesto di selezionare l'operazione e quindi di inserire due numeri. A seconda dell'input dell'utente, lo script stamperà il risultato. All'utente verrà chiesto di eseguire una nuova operazione dopo ogni selezione fino all'esecuzione del comando break
.
1) add
2) subtract
3) multiply
4) divide
5) quit
Select the operation: 1
Enter the first number: 4
Enter the second number: 5
4 + 5 = 9
Select the operation: 2
Enter the first number: 4
Enter the second number: 5
4 - 5 = -1
Select the operation: 9
Invalid option 9
Select the operation: 5
Uno svantaggio di questo script è che può funzionare solo con numeri interi.
Ecco una versione un po 'più avanzata. Stiamo usando lo strumento bc
che supporta numeri in virgola mobile (floating numbers) per eseguire calcoli matematici. Inoltre, il codice ripetitivo è raggruppato all'interno di una funzione.
Installare lo strumento bc
su Debian, Ubuntu, Linux Mint e derivate:
sudo apt install bc
Installare lo strumento bc
su CentOS, Red Hat e Fedora:
sudo yum install bc
Provare ad eseguire il seguente codice:
calculate () {
read -p "Enter the first number: " n1
read -p "Enter the second number: " n2
echo "$n1 $1 $n2 = " $(bc -l <<< "$n1$1$n2")
}
PS3="Select the operation: "
select opt in add subtract multiply divide quit; do
case $opt in
add)
calculate "+";;
subtract)
calculate "-";;
multiply)
calculate "*";;
divide)
calculate "/";;
quit)
break;;
*)
echo "Invalid option $REPLY";;
esac
done
1) add
2) subtract
3) multiply
4) divide
5) quit
Select the operation: 4
Enter the first number: 8
Enter the second number: 9
8 / 9 = .88888888888888888888
Select the operation: 5
Conclusione
Il costrutto select
ti consente di generare facilmente un menu. È particolarmente utile quando si scrivono script di shell che richiedono l'input dell'utente.