|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
[script shell Unix] Controllo con le regexp
Allora, stò provando in vari modi a controllare che un dato di input immesso dall'utente abbia una certa formattazzione.
L'utente in questione deve inserire un orario in questo formato: hh:mm:ss ore, minuti, secondi. In caso di errore lo script visualizzerà il relativo messaggio ecc.. Volevo sapere se esiste una metodologia precisa usando le espressioni regolari, stò guardando qualcosa in merito ad awk, ma credo ci sia un metodo più semplice. Un dato d'esempio corretto potrebbe essere questo: "19:00:56" quindi il mio pattern di convalida sarà: '/^[0-2][0-9]:[0-5][0-9]:[0-5][0-9]$/', certo l'utente potrebbe ancora inserire 29:10:00. Sarebbe bello prevedere anche questo livello di stupidità dell'utente in un unica espressione regolare ma per ora sono arrivato a questa... sono in cerca di consigli, grazie mille. |
![]() |
![]() |
![]() |
#2 | |
Senior Member
Iscritto dal: Jun 2000
Città: S.Giuliano (MI)
Messaggi: 1047
|
Quote:
/^([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$/ ma lo script in che linguaggio è? l'input avviene da tastiera?
__________________
“No te tomes tan en serio la vida, al fin y al cabo no saldrás vivo de ella” |
|
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
è uno script bash, la pattern indicata è l'espressione regolare che rappresenta la formattazione permessa per la stringa.
L'input è dato dall'utente, da tastiera. In pratica l'utente deve inserire un'orario nel formato indicato. |
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Feb 2006
Città: Parma
Messaggi: 3010
|
Ma, hai provato quello proposto da gurutech? Colma il buco che avevi evidenziato. Hai altri errori?
__________________
~Breve riferimento ai comandi GNU/Linux (ormai non molto breve...) |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
Si, grazie gurutech, credo che questa vada proprio meglio, però come eseguo il test? Una cosa del genere?
if [ "$time_value" = /^([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$/ ] then ... Così non funziona, oppure ho pensato di fare un sostituzione e controllare che l'output sia 0, in questo caso l'input sarebbe giusto... |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Feb 2006
Città: Parma
Messaggi: 3010
|
Così sembra funzioni, al solito non credo sia la soluzione più elegante...
Codice:
if [ `echo $time_value | grep -cE ^\([0-1][0-9]\|2[0-3]\):[0-5][0-9]:[0-5][0-9]$` -eq 1 ] then echo "vero" else echo "falso" fi
__________________
~Breve riferimento ai comandi GNU/Linux (ormai non molto breve...) |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
grazie ma così non funziona c'è un problema di parentesi e "|";
quest'ultimo viene visto come il passaggio di output al comando successivo, grep mi si incasina e mi segnala la mancata occorrenza di ")", difatti interpreta fino a "|" credendo che li il comando finisca. Comunque mi è servito di ispirazione e di lezione, devo leggere meglio le pagine di manuale ![]() Ho risolto sempre in maniera "roccambolesca" in questo modo: if [ 'echo "$time" | grep -vE ^[0-1][0-9]:[0-5][0-9]:[0-5][0-9]$ | grep -vcE ^2[0-3]:[0-5][0-9]:[0-5]:[0-9]$' -eq 0 ] then ..... ..... funziona perfettamente.... ![]() |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Feb 2006
Città: Parma
Messaggi: 3010
|
Come non funziona?
![]() Beh, alla fine si è risolto, anche se non son convinto che sia il meglio...
__________________
~Breve riferimento ai comandi GNU/Linux (ormai non molto breve...) |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Jun 2000
Città: S.Giuliano (MI)
Messaggi: 1047
|
io costringerei l'utente ad inserire solo delle cifre, e poi verificherei quanto fatto.
Codice:
#!/bin/bash KEYPRESS=n i=0; ORARIO=( 0 0 0 0 0 0 ) #salva la posizione del cursore echo -n -e "\033[s" while ( [ $i -lt 6 ] ); do { #ripristina la posizione del cursore echo -n -e "\033[u" echo -n ${ORARIO[0]}${ORARIO[1]}:${ORARIO[2]}${ORARIO[3]}:${ORARIO[4]}${ORARIO[5]} read -s -t 1 -n 1 KEYPRESS case "$i" in 0) if ( echo $KEYPRESS | egrep "([0-2])" 2> /dev/null &>/dev/null ); then { ORARIO[$i]=$KEYPRESS i=$((i+1)) } fi ;; 1) if ( echo $KEYPRESS | egrep "([0-9])" 2> /dev/null &>/dev/null ); then { VALORE="${ORARIO[0]}$KEYPRESS" if ( [ $VALORE -lt 24 ] ); then { ORARIO[$i]=$KEYPRESS i=$((i+1)) } fi } fi ;; 2|4) if ( echo $KEYPRESS | egrep "([0-5])" 2> /dev/null &>/dev/null ); then { ORARIO[$i]=$KEYPRESS i=$((i+1)) } fi ;; *) if ( echo $KEYPRESS | egrep "([0-9])" 2> /dev/null &>/dev/null ); then { ORARIO[$i]=$KEYPRESS i=$((i+1)) } fi ;; esac } KEYPRESS=n done echo -n -e "\033[u" echo -n ${ORARIO[0]}${ORARIO[1]}:${ORARIO[2]}${ORARIO[3]}:${ORARIO[4]}${ORARIO[5]} echo ""
__________________
“No te tomes tan en serio la vida, al fin y al cabo no saldrás vivo de ella” |
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
|
![]() |
![]() |
![]() |
#12 | ||
Senior Member
Iscritto dal: Jun 2000
Città: S.Giuliano (MI)
Messaggi: 1047
|
Quote:
per read devi leggere la pagina di manuale di bash while, if case e for sono tutti nella pagina man di bash. per le condizioni scritte tra parentesi quadre, tipo Codice:
while ( [ $i -lt 6 ] ) sempre nella pagina man di bash ti puo' interessare la sezione Quote:
grep (ed egrep) mettono sullo standard output:
per ultimo ti puo' essere utile la pagina man di echo. Le sequenze di ANSI Escape (quel \033[s ) le trovi qui se hai bisogno chiedi pure
__________________
“No te tomes tan en serio la vida, al fin y al cabo no saldrás vivo de ella” |
||
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
A ok, usi l'exit status per verificare....
davvero grazie per le indicazioni, ![]() ciao. |
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Feb 2006
Città: Parma
Messaggi: 3010
|
Bello! Grazie gurutech!
Ci ho giocato un po', soprattutto col cursore e sulla semplificazione della scrittura dei test. Ho imparato varie cose utili. Codice:
#!/bin/bash ORARIO=( 0 0 0 0 0 0 ) ReadTime() { i=0 echo -n -e "\033[s" echo -n ${ORARIO[0]}${ORARIO[1]}:${ORARIO[2]}${ORARIO[3]}:${ORARIO[4]}${ORARIO[5]} echo -n -e "\033[u" while read -s -n 1 KEYPRESS ; do case "$i" in 0) if echo $KEYPRESS | egrep -q [0-2] ; then echo -n $KEYPRESS ORARIO[$i]=$KEYPRESS ((i++)) fi ;; 1) if echo $KEYPRESS | egrep -q [0-9] ; then VALORE="${ORARIO[0]}$KEYPRESS" if [ $VALORE -lt 24 ] ; then echo -n $KEYPRESS echo -n -e "\033[1C" ORARIO[$i]=$KEYPRESS ((i++)) fi fi ;; 2|4) if echo $KEYPRESS | egrep -q [0-5] ; then echo -n $KEYPRESS ORARIO[$i]=$KEYPRESS ((i++)) fi ;; *) if echo $KEYPRESS | egrep -q [0-9] ; then echo -n $KEYPRESS if [ $i -eq 3 ] ; then echo -n -e "\033[1C" fi ORARIO[$i]=$KEYPRESS ((i++)) fi ;; esac if [ $i -eq 6 ] ; then break fi done echo } echo -n "Enter time: " ReadTime echo HOUR="${ORARIO[0]}${ORARIO[1]}" MINUTES="${ORARIO[2]}${ORARIO[3]}" SECONDS="${ORARIO[4]}${ORARIO[5]}" echo "Hour: $HOUR, minutes: $MINUTES, seconds: $SECONDS" echo
__________________
~Breve riferimento ai comandi GNU/Linux (ormai non molto breve...) Ultima modifica di Gimli[2BV!2B] : 31-03-2009 alle 23:51. |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 10:12.