23 BASH – Acquisire dati da tastiera

1 Aprile, 2024 (07:23) | BASH, Linux | By: sargonsei

23 BASH – Acquisire dati da tastiera
L’istruzione “read” consente a BASH di acquisire dati in fase di esecuzione dello script BASH senza modificare parti dello script stesso. Grazie al comando “read”, l’utente può passare i dati allo script direttamente da tastiera, durante la fase di esecuzione dello script stesso.
Questo comando consente l’utilizzo di opzioni con le quali il programmatore può predeterminare la lunghezza e la visualizzazione dato digitato.
L’assenza di opzioni fa sì che il comando [read] accetti e visualizzi -senza limiti di tempo- tutti i caratteri digitati dall’utente da quando BASH esegue l’istruzione a quando l’utente digita [Invio]
L’opzione [-s] inibisce la visualizzare dei dati digitati.
L’opzione [-nN] simula la digitazione del tasto [Invio] dopo aver acquisito N caratteri.
L’opzione [-p “Messaggio”] fa sì che la lettura dell’Input sia preceduta dal messaggio riportato fra apici.
L’opzione [-t S] simula la digitazione del tasto [Invio] dopo aver atteso S secondi.
Le singole opzioni possono combinarsi fra loro, ragion per cui la combinazione di opzioni [-n4 -t5] fa sì che l’utente abbia 5 secondi per digitare 4 caratteri, ma la pressione del tasto [Invio] fa sì che il comando termini senza attendere né l’immissione del numero massimo di caratteri attesi, né il numero massimo di secondi concessi all’utente per digitare il dato richiesto; infatti:
1. l’acquisizione dei dati termina appena sono stati inseriti 4 caratteri, anche se non sono trascorsi 5 secondi e/o non è stato digitato [Invio];
2. l’acquisizione dei dati termina appena sono trascorsi 5 secondi, anche se non sono stati digitati 4 caratteri e/o non è stato digitato [Invio];
3. l’acquisizione dei dati termina appena l’utente digita [Invio], anche se non sono stati digitati 4 caratteri e/o non sono trascorsi 5 secondi.
Qualora l’utente utilizzi il comando “read” non per acquisire un dato da tastiera ma per fermare l’esecuzione dello script BASH da quando viene eseguita a quando l’utente digita [Invio], la variabile destinata a contenere i caratteri digitati può essere omessa; tuttavia, quando si usa il comando “read” per tale scopo, si consiglia di affiancarvi il comando [echo “Testo”] oppure inserire l’opzione [-p “Testo”] per spiegare all’utente che il computer sta attendendo la pressione del tasto [Invio]; seguono alcuni esempi.
echo "Per continuare, digita [Invio]."; read; echo "Hai digitato [Invio]."
read -p "Per continuare, digita [Invio]."; echo "Hai digitato [Invio]."
read -t 3 -p "Per proseguire, attendi 3 secondi oppure digita [Invio]."; echo " BASH prosegue."
read -n 2 -t 3 -p "Per proseguire, digita 2 caratteri, o attendi 3 secondi, o digita [Invio]."; echo " BASH prosegue."

23.1 BASH – Acquisire dati da tastiera (default)
Di default e senza opzioni, il comando “read” attende la pressione di una qualsiasi sequenza di tasti ma non visualizza nessun messaggio che spieghi che sta aspettando l’inserimento di dati, quindi il programmatore dovrà farlo precedere da un apposito messaggio che invita l’utente a digitare il dato atteso; l’acquisizione termina quando l’utente digita il tasto [Invio].

#!/bin/bash
: || { Leggere da tastiera
 Per avviare questo script BASH chiamato [leggeDaTastiera1.txt]
 aprire un terminale nella cartella in cui si trova questo script
 ed impartire il comando
 ./leggeDaTastiera1.txt
}
echo "Digita qualcosa; quando hai finito, premi il tasto [Invio]."
read A1
echo "Hai digitato: $A1"
exit 0

23.2 BASH – Acquisire da tastiera un numero predefinito di tasti

#!/bin/bash
: || { Leggere da tastiera senza dover premere INVIO
 Per avviare questo script BASH chiamato [leggeDaTastiera2.txt]
 aprire un terminale nella cartella in cui si trova questo script
 ed impartire il comando
 ./leggeDaTastiera2.txt
 L’opzione -s serve a non visualizzare il carattere corrispondente al tasto premuto.
 L’opzione -n N indica che devono essere accettati solo N caratteri di input.
 L’opzione -p permette di visualizzare il messaggio del prompt.
 Rispettare ordine delle opzioni suddette.
}
read -s -n1 -p "Premi un tasto " A1
echo; echo "Hai premuto il tasto "\"$A1\""."
exit 0

23.3 BASH – Acquisire da tastiera un vari modi

#!/bin/bash
: || { Leggere da tastiera in vari modi
 Per avviare questo script BASH chiamato [leggeDaTastiera3.txt]
 aprire un terminale nella cartella in cui si trova questo script
 ed impartire il comando
 ./leggeDaTastiera3.txt
 L’opzione -s serve a non visualizzare l’input.
 L’opzione -n N simula la pressione del tasto [Invio] dopo aver accettato N caratteri.
 L’opzione -p permette di visualizzare il messaggio del prompt.
 Rispettare ordine delle opzioni suddette.
}
read -p "Premi alcuni tasti, poi digita [Invio] " A1
echo; echo "Hai premuto i tasti '$A1'."
read -n4 -p "Premi alcuni tasti (max 4) poi digita [Invio] " A1
echo; echo "Hai premuto i tasti '$A1'."
read -n2 -p "Premi 2 tasti " A1
echo; echo "Hai premuto i tasti '$A1'."
read -s -n1 -p "Premi un tasto " A1
echo; echo "Hai premuto il tasto "\"$A1\""."
exec echo "Lo script \"$0\"è terminato." # Esce dallo script in questo punto
echo "Questa riga non verrà mai eseguita, perché preceduta da riga exec"
exit 0

23.4 BASH – Acquisire da tastiera un numero predefinito di tasti entro un tempo massimo
L’opzione -t S fa sì che la lettura dell’Input sia attesa per non più di S secondi.

#!/bin/bash
: || { Leggere un tasto da tastiera entro 4 secondi
 Per avviare questo script BASH chiamato [leggeDaTastiera.txt]
 aprire un terminale nella cartella in cui si trova questo script
 ed impartire il comando
 ./leggeDaTastiera.txt
 L’opzione -s serve a non visualizzare il carattere corrispondente al tasto premuto.
 L’opzione -n N simula la pressione del tasto [Invio] dopo aver accettato N caratteri.
 L’opzione -t SEC simula la pressione del tasto [Invio] dopo SEC secondi.
 L’opzione -p permette di visualizzare il messaggio del prompt.
}
sec=4        # 4 secondi
read -s -n1 -t $sec -p "Premere un tasto entro $sec secondi " A4
echo
if [ -z "$A4" ]  # È nulla?
then
  echo "Tempo scaduto, non hai premuto nessun tasto."
else
  echo "Hai premuto il tasto = $A4"
fi
exit 0