PDA

Visualizza la versione completa : [BASH] Controllo parametro tramite regular expression


sapientino
08-02-2011, 15:02
Come faccio a controllare con una regular expression che il parametro ricevuto da read sia un ip?

Io provo così:


while [ "$riga"!= "*.*.*.*" ]
do
echo "Inserisci un ip:"
read riga
done


ma la shell mi restituisce:

line 1: [: !=: unary operator expected

jobv
08-02-2011, 15:34
Ciao,

forse non c'entra nulla ma "riga" è inizializzata?

toraz
08-02-2011, 16:07
Originariamente inviato da sapientino
[ "$riga"!= "*.*.*.*" ]



Questo e` tutto sbagliato:

1. ci vuole uno spazio tra "$riga" e != (da cui l'errore)

2. test non permette di confrontare una stringa con un'espressione regolare, solo una stringa con un altra per uguaglianza, disuguaglianza e ordinamento lessicografico (maggiore/minore). Devi usare qualche altro comando tipo grep, sed o awk

3. "*.*.*.*" non e` nemmeno un'espressione regolare valida

sapientino
08-02-2011, 16:30
@jobv
Non credo serva inizializzarla perché se è la variabile è ineststente il while parte lo stesso (credo che la consideri null)

@toraz
Se lascio lo spazio mi segna un altro errore:


$ line 1: [: too many arguments

era per quello che l'avevo inserito.

Resta il fatto che io non ho capito ancora come fare per controllare che l'utente inserisca un ip valido del tipo:
*.*.*.*
o meglio ancora
???.???.???.???

C'è da impazzire con lo scripting da shell.
Qualcuno che mi aiuti?

sapientino
08-02-2011, 16:32
se scrivo:


while [ !expr "$riga != [*.*.*.*]" ]

si ritorna all'errore originario.

Come faccio questo controllo?
AIUTO!! :bhò:

toraz
08-02-2011, 18:12
Siccome buona parte dei tuoi tentativi, lasciatelo dire :), non stanno ne' in cielo ne' tantomeno in terra ti consiglierei di leggere Advanced Bash Scripting (che a dispetto del nome parte dall'ABC), se cerchi su Google trovi anche una versione tradotta in italiano.

Venendo al merito, per fare il controllo devi usare un comando tipo grep, esempio alla buona che mi viene in mente su due piedi



while [ ! `echo "$riga" | grep -E "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$"` ]; do
read riga
done
echo finalemente


l'espressione regolare non e` precisissima (accetterebbe anche un indirizzo tipo 444.444.444.444) ma credo che renda l'idea. Probabilmente ci sono anche soluzioni migliori, ma questa e` la prima che m'e` venuta in mente...

sapientino
08-02-2011, 19:24
Perfetto.
Poi troverò un modo per splittare l'ip usando i punti ed inserirò un altra condizione all'interno del while con il -a

Comunque per quanto riguarda lo shell scripting te la cavi alla grande!
Ti faccio altre due domande per concludere e poi ti lascio in pace.


E se tra i punti non avessi voluto solo numeri, ma mi fosse andato bene qualsiasi altro carattere?
E se tra i punti avessi voluto SOLO lettere o numeri?

Ah, grazie mille per l'aiuto che mi stai fornendo. Non so proprio come ringraziati.
Mi vuoi sposare?

sapientino
08-02-2011, 20:12
Ho studiato qualcosina, ma ci sono 50 tipi di regular expressions.

Ho messo solo 2 punti per abbreviare, tanto è tutto uguale.



while [ ! `echo "$riga" | grep -E "^[[0-9][A-Za-z]]{1,3}\.[[0-9][A-Za-z]]{1,3}\.[[0-9][A-Za-z]]{1,3}$"` ]


vorrei fare accettare robe tipo
a.14p.qqr

Adesso non capisco più cosa sbaglio.

sapientino
08-02-2011, 20:14
YEAHHHHHHHHHHHH

Risolto.



while [ ! `echo "$riga" | grep -E "^[0-9A-Za-z]{1,3}\.[0-9A-Za-z]{1,3}\.[0-9A-Za-z]{1,3}$"` ]



TORAZ GRAZIE MILLER PER L'AIUTO.

Segnalo un supermitico link che mi ha aiutato:

Link supermitico sulle regexp (http://natonelbronx.wordpress.com/2007/12/02/le-espressioni-regolari-regex-o-regexp/)

sapientino
08-02-2011, 20:30
Ehm....Toraz, non pensare che io sia pazzo.

Esiste un comando per abbreviare una stringa tramite regular espression?
Cerco un comando che mi prenda solo la parte che gli passo nella regular expression.

Esempio (volgio quello che c'è dopo "ci" e prima di "o" )


echo "ciao" | COMANDO "^ci" "o$"

Ti prego, dimmi che esiste!

Loading