Script inserimento data

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
nik_12
Prode Principiante
Messaggi: 3
Iscrizione: martedì 14 marzo 2017, 21:43
Desktop: ubuntu
Distribuzione: Ubuntu 16.04.1 LTS x86_64
Sesso: Maschile

Script inserimento data

Messaggio da nik_12 »

Salve a tutti, sono un nuovo utente sia del forum che del mondo linux. Qualche giorno fa mi sono imbattuto nella programmazione di script e volevo farne uno che controllasse il corretto inserimento di una data. Ho cercato anche di imparare il funzionamento delle regular expression per realizzarlo. Lo script è questo:

Codice: Seleziona tutto

#!bin/bash
#verificare che la data inserita sia corretta
echo "Inserire data"
read date
if ( echo $date | grep "0[1-9]\|[1-9]\|[1-2][0-9]\|3[0-1]/[1-9]\|0[1-9]\|1[0-2]/[0-9][0-9][0-9][0-9]" ) then
echo ok
else
echo no
fi
nella stringa controllata dal grep dovrei permettere, per il giorno, l'inserimento o in formato 0x o in formato x, in un giorno che varia o da 1 a 9, o da 10 a 29 o 30 o 31, con il metacarattere '|' preceduto da '\' che so che solitamente serve a non trattare il carattere successivo come metacarattere, ma non in questo caso dove funziona contrariamente (utilizzo la pipe per non accettare l'inserimento di un giorno maggiore di 31).Dopo '/' è permesso l'inserimento di un mese con numero compreso tra 1 e 12 ( anche questo può essere inserito in formato 0x), e infine l'anno con qualsiasi numero a 4 cifre.
Nessun problema fino a quando provo solo con l'inserimento del giorno... ma non appena cerco di controllare anche il mese, per qualsiasi data inserisca ricevo "ok". Spero di essere stato abbastanza chiaro e ringrazio in anticipo chi vorrà aiutarmi.
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: Script inserimento data

Messaggio da crap0101 »

quella regex non va bene perchè sono tutti or logici indipendenti, per cui non matcha una sequenza particolare di caratteri numerici (come una data) ma qualunque input che presenta al suo interno un carattere numerico (a parte un input il cui ipotetico unico numero sia "0" (zero)).

Codice: Seleziona tutto

"0[1-9]\|[1-9]\|[1-2][0-9]\|3[0-1]/[1-9]\|0[1-9]\|1[0-2]/[0-9][0-9][0-9][0-9]"
significa: vedi se la stringa che ti passo contiene uno 0 seguito da un carattere dall'1 al 9 OPPURE un carattere dall'1 al 9 OPPURE un 1 o un 2 seguito da un carattere dallo 0 al 9 OPPURE un 3 seguito da uno 0 o un 1 seguito da uno slash seguito da un carattere dall'1 al 9 OPPURE uno 0 seguito da un carattere dall'1 al 9 OPPURE un 1 seguito da un carattere tra 0 e 2 seguito da uno slash seguito da un carattere dallo 0 al 9 a sua volta seguito da un carattere dallo 0 al 9 a sua volta seguito da un carattere dallo 0 al 9 a sua volta seguito da un carattere dallo 0 al 9.
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: Script inserimento data

Messaggio da crap0101 »

per dire, una cosa del genere dovrebbe funzionare come intendi:

Codice: Seleziona tutto

grep -E '^(0?[1-9]|[12][0-9]|30|31)/(0?[1-9]|10|11|12)/[0-9][0-9][0-9][0-9]$'
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2842
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: Script inserimento data

Messaggio da rai »

Ciao :) benvenuto nel forum e soprattutto nel mondo di GNU/Linux


Aggiungo qualcosa a quanto scritto da crap0101 che ha postato praticamente la stessa regex che ti avrei passato io

Codice: Seleziona tutto

grep -E "^(0?[1-9]|1[0-9]|2[0-9]|3[0-1])/(0?[1-9]|1[0-2])/[0-9]{4}$" 
Nota la potenzialità delle espressioni regolari Estese (grep -E) che sono più leggibili di quelle basic dove devi escapare tutto.

Comunque, a mio modo di vedere ci sono delle limitazioni usando l'una o l'altra espressione così come sono (a parte le date da StarTrek, che in questo forum hanno qualche fan):

L'anno deve avere 4 cifre, non può averne 2
questo si sistema sostituendo il quantificatore {4} con {2,4}. Effetto collaterale: questo fa potenzialmente perdere portabilità allo script che contiene l'espressione

I separatori sono hardcoded: /
questo si potrebbe superare usando invece il metacarattere \W che rappresenta qualsiasi carattere non alfanumerico (non solo spazi, / - ma anche per esempio . | : ; etc): non so se è quello che vuoi

ma soprattutto non c'è nessun controllo su date inesistenti come 29/02/2017 o 31/4/8916
per ovviare a questo potresti verificare la correttezza formale della stringa in quanto data, piuttosto che con una regex, mediante `date -d': se ti interessa ti cerco una discussione qui sul forum dove si parlava di questo e da cui ho tratto un modo che uso appunto per verificare la correttezza dell'inserimento di una data
nik_12
Prode Principiante
Messaggi: 3
Iscrizione: martedì 14 marzo 2017, 21:43
Desktop: ubuntu
Distribuzione: Ubuntu 16.04.1 LTS x86_64
Sesso: Maschile

Re: Script inserimento data

Messaggio da nik_12 »

Grazie innanzitutto per le risposte. Avevo intuito l'errore che avevo commesso con l'or logico. Avete usato una serie di termini che non avevo mai sentito e che mi hanno incuriosito. Che significa regex Estese e perché sono più leggibili? Perché il quantificatore {2,4} fa perdere portabilità allo script? Inoltre ho notato che aggiungendo al grep il parametro -E vengono tolti i '\' prima delle pipe, perché? Scusate se faccio così tante domande. Vi sono molto grato per la disponibilità.
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2842
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: Script inserimento data

Messaggio da rai »

provo a chiarire con l'aiuto del manuale, che ti suggerisco di leggere

Codice: Seleziona tutto

man grep
Basic vs Extended Regular Expressions
In basic regular expressions the meta-characters ?, +, {, |, (, and ) lose their special meaning; instead use the backslashed versions \?, \+, \{,
\|, \(, and \).

Traditional egrep did not support the { meta-character, and some egrep implementations support \{ instead, so portable scripts should avoid { in
grep -E patterns and should use [{] to match a literal {.

GNU grep -E attempts to support traditional usage by assuming that { is not special if it would be the start of an invalid interval specification.
For example, the command grep -E '{1' searches for the two-character string {1 instead of reporting a syntax error in the regular expression.
POSIX.2 allows this behavior as an extension, but portable scripts should avoid it.
quindi molti metacaratteri che nelle BRE hanno il loro significato speciale solo se precedute dallo backslash \ [cioè `escapate' con un anglismo bruttino ma a cui ci si abitua perchè sintetico] nelle ERE invece si scrivono senza (e al contrario lì perdono il significato speciale se precedute dall'escape )

Se elimini una quantità di backslash, la lettura della espressione regolare è più semplice, a volte già a colpo d'occhio

Sul fatto della portabilità del quantificatore {n}, oltre al manuale, adesso non ricordo con esattezza ma so di essermi imbattuto in un grep [probabilmente non-GNU] in cui non funzionava
comunque, aspetta anche crap0101, io sono un orecchiante, piuttosto che un conoscitore della materia
nik_12
Prode Principiante
Messaggi: 3
Iscrizione: martedì 14 marzo 2017, 21:43
Desktop: ubuntu
Distribuzione: Ubuntu 16.04.1 LTS x86_64
Sesso: Maschile

Re: Script inserimento data

Messaggio da nik_12 »

Perfetto, ho capito tutto. Sono molto soddisfatto e vi ringrazio ancora una volta.
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 7 ospiti