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.