Script inserimento data

Linguaggi di programmazione: php, perl, python, C, bash, ecc.

Script inserimento data

Messaggioda nik_12 » martedì 14 marzo 2017, 22:25

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.
nik_12
Prode Principiante
 
Messaggi: 3
Iscrizione: marzo 2017
Desktop: ubuntu
Distribuzione: Ubuntu 16.04.1 LTS x86_64
Sesso: Maschile

Re: Script inserimento data

Messaggioda crap0101 » mercoledì 15 marzo 2017, 21:47

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: 8121
Iscrizione: ottobre 2007
Località: TO
Desktop: Lubuntu
Distribuzione: Ubuntu 14.04.3 LTS
Sesso: Maschile

Re: Script inserimento data

Messaggioda crap0101 » mercoledì 15 marzo 2017, 21:54

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
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
 
Messaggi: 8121
Iscrizione: ottobre 2007
Località: TO
Desktop: Lubuntu
Distribuzione: Ubuntu 14.04.3 LTS
Sesso: Maschile

Re: Script inserimento data

Messaggioda rai » mercoledì 15 marzo 2017, 22:39

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
rai
Entusiasta Emergente
Entusiasta Emergente
 
Messaggi: 1692
Iscrizione: maggio 2008
Località: Palermo
Distribuzione: 12.04

Re: Script inserimento data

Messaggioda nik_12 » venerdì 17 marzo 2017, 12:34

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à.
nik_12
Prode Principiante
 
Messaggi: 3
Iscrizione: marzo 2017
Desktop: ubuntu
Distribuzione: Ubuntu 16.04.1 LTS x86_64
Sesso: Maschile

Re: Script inserimento data

Messaggioda rai » sabato 18 marzo 2017, 19:24

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
rai
Entusiasta Emergente
Entusiasta Emergente
 
Messaggi: 1692
Iscrizione: maggio 2008
Località: Palermo
Distribuzione: 12.04

Re: Script inserimento data

Messaggioda nik_12 » mercoledì 22 marzo 2017, 7:35

Perfetto, ho capito tutto. Sono molto soddisfatto e vi ringrazio ancora una volta.
nik_12
Prode Principiante
 
Messaggi: 3
Iscrizione: marzo 2017
Desktop: ubuntu
Distribuzione: Ubuntu 16.04.1 LTS x86_64
Sesso: Maschile


Torna a Programmazione

Chi c’è in linea

Visualizzano questa sezione: 0 utenti registrati e 3 ospiti