Pagina 1 di 1
[Risolto][BASH] aiuto su regex
Inviato: martedì 16 giugno 2015, 17:22
da errullaiolo
Leggo da stdin <username,password> e voglio che una variabile usr contenga la mia username e la variabile pas la mia password.
Per prelevare l'username creo un pattern che va dall'inizio della stringa fino alla virgola e vado a prendermi la sottostringa fino a len-1.
Per la password non riesco a matchare dalla virgola alla fine. Avete qualche consiglio?
Codice: Seleziona tutto
#!/bin/bash
read usr_pass
function check_usr_pass()
{
usr=`expr match "$1" '\(.*,\)'`
usr=${usr:0:$(( ${#usr} -1 ))}
pass=
}
check_usr_pass $usr_pass
exit 0
Re: [BASH] aiuto su regex
Inviato: martedì 16 giugno 2015, 17:28
da errullaiolo
Può essere risolto anche in altri modi, giustamente avendo la lunghezza dell'username e quella della stringa tot potrei fare:
len(stringaTot) - len(username compresa di virgola)
Ma vorrei capire la regex.
Re: [BASH] aiuto su regex
Inviato: martedì 16 giugno 2015, 17:36
da Zoff
Per la virgola nello username basta metterla fuori dalle parentesi:
Per la password devi rigordarti di inserire nel pattern anche le lettere precedenti la virgola, senza parentesi per non raccogliere il match:
Re: [BASH] aiuto su regex
Inviato: martedì 16 giugno 2015, 17:44
da errullaiolo
Wow grazie. Quindi con le parentesi raccolgo tutto c'ho che fa match col pattern tra parentesi. Il resto lo controlla e basta?
Re: [BASH] aiuto su regex
Inviato: martedì 16 giugno 2015, 17:46
da vaeVictis
Se la stringa username,password contiene solo la virgola di separazione dei due campi, e non altre virgole contenute nello username o nella password, io lascerei stare le espressioni regolari e userei le operazioni sugli array:
Codice: Seleziona tutto
vaevictis@vaevictis-N56VV:~$ foo=username,password
vaevictis@vaevictis-N56VV:~$ echo ${foo%%,*}
username
vaevictis@vaevictis-N56VV:~$ echo ${foo##*,}
password
Re: [BASH] aiuto su regex
Inviato: martedì 16 giugno 2015, 18:03
da errullaiolo
Caspita è vero non mi ricordavo. Potreste ricordarmi la differenza tra ${foo%,*} ${foo#*,} e ${foo%%,*} $foo{##*,} ?
L'equal tilde operator: "ciao" =~ [a] controlla se la 'a' è presente in 'ciao' oppure faccio "ciao" =~ .*[a].* ?
Comunque risolto, un pò farraginoso ma funzionante.
Codice: Seleziona tutto
#!/bin/bash
read usr_pass
function check_usr()
{
if [ ${#1} -lt 5 ] || [[ $1 =~ [^a-zA-Z0-9] ]] || [[ $1 =~ ^[0-9] ]]; then
echo "Errore Autenticazione">out
exit 12
fi
}
function check_pass()
{
if [ ${#1} -lt 3 ] || [[ $1 =~ [^a-z0-9] ]]; then
echo "Errore Autenticazione">out
exit 12
fi
}
function check_usr_pass()
{
usr=`expr match "$1" '\(.*,\)'`
if [ $? -ne 1 ]; then
usr=${usr:0:$(( ${#usr} -1 ))}
else
echo "Errore Autenticazione">out
exit 12
fi
check_usr $usr
pass=`expr match "$1" '.*,\(.*\)'`
check_pass $pass
}
# CHECK USERNAME AND PASSWORD #
check_usr_pass $usr_pass #
##############################
echo "username:$usr;password:$pass">out
exit 56
Re: [BASH] aiuto su regex
Inviato: martedì 16 giugno 2015, 19:13
da vaeVictis
Alle domande del tuo ultimo messaggio risponde già il materiale disponibile online, che va *rigorosamente* ottimizzato
Operazioni su stringa (vedi il punto: Example 27-4. String operations on arrays)
Equal tilde operator
Re: [BASH] aiuto su regex
Inviato: mercoledì 17 giugno 2015, 10:28
da Zoff
Beh se si tratta di fare le cose per bene allora molto meglio evitare l'invio delle credenziali in chiaro come opzione dello script, optando per la lettura da STDIN con read e l'opzione -s per la password.
Re: [BASH] aiuto su regex
Inviato: mercoledì 17 giugno 2015, 19:30
da errullaiolo
Grazie mille non lo sapevo. Posso dire che si é conclusa con un risolto alla grande.