[BASH] Controllare se il primo token della stringa è un char

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
errullaiolo
Prode Principiante
Messaggi: 185
Iscrizione: giovedì 17 gennaio 2013, 14:09
Distribuzione: Ubuntu 14.04.2 LTS
Sesso: Maschile

[BASH] Controllare se il primo token della stringa è un char

Messaggio da errullaiolo »

La mia soluzione consiste nell'interare su tutte le lettere possibile e controllare se il mio token è uguale a una delle lettere

Codice: Seleziona tutto

uc=`echo $username | cut -c1`
for c in {{a..z},{A..Z}}; do
    if [ $c = $uc ]; then
	echo è una lettera
	break
    fi
done
Esiste una soluzione meno ridondante?
« Una volta eliminato l'impossibile, ciò che resta, per quanto improbabile, deve essere la verità. »
(Sherlock Holmes)
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: [BASH] Controllare se il primo token della stringa è un

Messaggio da vaeVictis »

Codice: Seleziona tutto

vaevictis@vaevictis-N56VV:~$ foo=osofj
vaevictis@vaevictis-N56VV:~$ [[ $foo =~ ^[0-9].*$ ]] && echo "inizia con un numero" || echo "inizia con una lettera"
inizia con una lettera
vaevictis@vaevictis-N56VV:~$ foo=1dkln
vaevictis@vaevictis-N56VV:~$ [[ $foo =~ ^[0-9].*$ ]] && echo "inizia con un numero" || echo "inizia con una lettera"
inizia con un numero
p.s.: in effetti il ciclo for fa molto film horror :o
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
errullaiolo
Prode Principiante
Messaggi: 185
Iscrizione: giovedì 17 gennaio 2013, 14:09
Distribuzione: Ubuntu 14.04.2 LTS
Sesso: Maschile

Re: [BASH] Controllare se il primo token della stringa è un

Messaggio da errullaiolo »

wow bellissima... Cosa sta a significare =~ ?
Un'altra soluzione possibile è:

Codice: Seleziona tutto

uc=`echo $username | cut -c1`
testing=$( printf "%d" "'${uc}" )
echo $testing
if (($testing<=122 )) && (( $testing>=97 )) ||
   (($testing<=90 )) && (( $testing>=65 )); then
    echo è una lettera
fi
perchè prima di $uc nella print ci va l'apice singolo?
« Una volta eliminato l'impossibile, ciò che resta, per quanto improbabile, deve essere la verità. »
(Sherlock Holmes)
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: [BASH] Controllare se il primo token della stringa è un

Messaggio da crap0101 »

sembra essere necessario quotare l'argomento per fargli fare la conversione char -> numero, altrimenti con %d si aspetta appunto un numero e non un carattere A-Za-z .
btw, anche se pare funzionare lo stesso così com'è, probabilmente è meglio metterci anche quello in chiusura

Codice: Seleziona tutto

"'${uc}'"
btw, meglio

Codice: Seleziona tutto

[[ ${foo:0:1} =~ [a-zA-Z] ]]
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
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: [BASH] Controllare se il primo token della stringa è un

Messaggio da vaeVictis »

crap0101, te l'ho chiesto in privato, ma forse è il caso di parlarne qui. Alla fine può interessare anche altri.
Come mai hai fatto lo "slicing" dell'array?

Codice: Seleziona tutto

[[ ${foo:0:1} =~ [a-zA-Z] ]]
Dici che è più veloce dell'alternativa

Codice: Seleziona tutto

[[ $foo =~ ^[0-9].*$ ]]
Mi hai incuriosito :)

edit:
Non avevo visto la domada
wow bellissima... Cosa sta a significare =~ ?
È un modo per usare le espressioni regolari all'interno del test (con le parentesi quadre).
Stai studiando su qualche risorsa online? Senza che entro nel dettaglio (più che altro per ridondanza, visto che si trovano tonnellate di informazioni a riguardo... in inglese) prova con una ricerca di Google con chiave "bash test regular expression". Butta un occhio e poi magari chiedi quello che non ti dovesse risultare chiaro :)
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
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: [BASH] Controllare se il primo token della stringa è un

Messaggio da crap0101 »

non so se sia più veloce... in ogni caso penso sia inifluente; ho fatto in quel modo perchè siccome controlla solo il primo carattere (il mio $foo sarebbe il suo $username) semplifico la regex a destra.
btw, in generale mi sembra meglio cercare di matchare cosa si sta cercando piuttosto che matchare quello che si esclude, con il [0-9] "esclusivo" si lasciano fuori tanti altri caratteri che probabilmente non si vogliono al pari dei numeri.
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
errullaiolo
Prode Principiante
Messaggi: 185
Iscrizione: giovedì 17 gennaio 2013, 14:09
Distribuzione: Ubuntu 14.04.2 LTS
Sesso: Maschile

Re: [BASH] Controllare se il primo token della stringa è un

Messaggio da errullaiolo »

Sto studiando System e Shell Programming all'uni e le regxp le conosco bene ma non sapevo esistesse l'equal tilde operator. Vi ringrazio tantissimo :birra:
« Una volta eliminato l'impossibile, ciò che resta, per quanto improbabile, deve essere la verità. »
(Sherlock Holmes)
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti