Precedente | Contenuto | Successivo
Fino ad ora, i nostri script non sono stati interattivi. Cioè, non hanno accettato alcun input dall’utente. In questa lezione, vedremo come i nostri script possono fare domande, e ottenere e usare le risposte.
leggere
Per ottenere input dalla tastiera, usiamo il comando read
. Il comando read
prende l’input dalla tastiera e lo assegna ad una variabile. Ecco un esempio:
echo
-n “Inserisci del testo >read
testoecho
“Hai inserito: $text” Come possiamo vedere, abbiamo visualizzato un prompt alla linea 3. Notate che “-n
“dato al comando echo
fa sì che mantenga il cursore sulla stessa linea; cioè, non emette un linefeed alla fine del prompt.
In seguito, invochiamo il comando read
con “text
” come argomento. Ciò che questo fa è aspettare che l’utente digiti qualcosa seguito dal tasto Invio e poi assegna ciò che è stato digitato alla variabile text
.
Ecco lo script in azione:
read_demo.bash
Inserisci del testo >this is some text
Hai inserito: questo è del testoSe non diamo al comando read
il nome di una variabile per assegnare il suo input, userà la variabile d’ambienteREPLY
.
Il read
comando ha diverse opzioni della linea di comando, le tre più interessanti sono -p
-t
e-s
.
L’opzione -p
ci permette di specificare un prompt che precede l’input dell’utente. Questo risparmia il passo extra di usare un echo per chiedere all’utente. Ecco l’esempio precedente riscritto per usare l’opzione -p
:
read
-p “Inserisci del testo > ” textecho
“Hai inserito: $text”L’opzione -t
seguita da un numero di secondi fornisce un timeout automatico per il comando read
. Questo significa che il comando read
rinuncerà dopo il numero di secondi specificato se non è stata ricevuta alcuna risposta dall’utente.Questa opzione potrebbe essere usata nel caso di uno script che deve continuare (magari ricorrendo a una risposta predefinita) anche se l’utente non risponde alle richieste.Ecco l’opzione -t
in azione:
echo
-n “Sbrigati a scrivere qualcosa! >if read
-t 3 response; then
echo
“Ottimo, hai fatto in tempo!”else
echo
“Scusa, sei troppo lento!”fi
L’opzione -s
fa sì che la digitazione dell’utente non venga visualizzata. Questo è utile quando si chiede all’utente di digitare una password o altre informazioni riservate.
Aritmetica
Siccome stiamo lavorando su un computer, è naturale aspettarsi che possa eseguire qualche semplice aritmetica. La shell fornisce funzioni per l’aritmetica dei numeri interi.
Cos’è un numero intero? Significa numeri interi come 1, 2, 458, -2859. Non significa numeri frazionari come 0,5, .333, o 3,1415. Per trattare con i numeri frazionari, c’è un programma separato chiamato bc
che fornisce un linguaggio di calcolo a precisione arbitraria. Può essere usato negli script di shell, ma va oltre lo scopo di questo tutorial.
Diciamo che vogliamo usare la linea di comando come una calcolatrice primitiva. Possiamo fare così:
echo $((2+2))
Quando circondiamo un’espressione aritmetica con le doppie parentesi, la shell eseguirà un’espansione aritmetica.
Nota che gli spazi bianchi sono ignorati:
echo $((2+2))
echo $(( 2+2 ))
echo $(( 2 + 2 ))
4La shell può eseguire una varietà di operazioni aritmetiche comuni (e non così comuni). Ecco un esempio:
read
-p “Inserisci il primo numero –> ” first_numread
-p “Inserisci il secondo numero -> ” second_numecho
“primo numero + secondo numero = $((first_num + second_num))echo
“primo numero – secondo numero = $((first_num – secondo_num))”echo
“primo numero * secondo numero = $((first_num * second_num))”echo
“primo numero / secondo numero = $((first_num / second_num))”echo
“primo numero % secondo numero = $((first_num % second_num))”echo
“primo numero elevato alla”echo
“potenza del secondo numero = $((first_num ** second_num))”Nota come il leading “$
” non sia necessario per referenziare variabili all’interno dell’espressione aritmetica come “first_num +second_num
“.
Provare questo programma e guardare come gestisce la divisione (ricordate, questa è una divisione intera) e come gestisce i numeri grandi. I numeri che diventano troppo grandi traboccano come il contachilometri di un’auto quando supera il numero di miglia che è stato progettato per contare. Ricomincia da capo, ma prima passa attraverso tutti i numeri negativi a causa di come i numeri interi sono rappresentati in memoria. La divisione per zero (che non è matematicamente valida) causa un errore.
Le prime quattro operazioni, addizione, sottrazione, moltiplicazione e divisione, sono facilmente riconoscibili, ma la quinta può non essere familiare. Il simbolo “%
” rappresenta il resto (noto anche come modulo). Questa operazione esegue la divisione ma invece di restituire un quoziente come la divisione, restituisce il resto. Anche se questo potrebbe non sembrare molto utile, in realtà fornisce una grande utilità quando si scrivono i programmi. Per esempio, quando l’operazione di resto restituisce zero, indica che il primo numero è un multiplo esatto del secondo. Questo può essere molto utile:
read
-p “Inserisci un numero > ” numeroecho
“Il numero è $numero”if ;
then
echo
“Il numero è pari”else
echo
“Il numero è dispari”fi
Oppure, in questo programma che formatta un numero arbitrario di secondi in ore e minuti:
read
-p “Inserire il numero di secondi > ” secondshours=$((seconds / 3600))seconds=$((seconds % 3600))minutes=$((seconds / 60))seconds=$((seconds % 60))echo
“$hours hour(s) $minutes minute(s) $seconds second(s)”