Sto cercando di fare qualcosa di abbastanza comune: analizzare l'input dell'utente in uno script di shell. Se l'utente ha fornito un numero intero valido, lo script fa una cosa e, se non è valido, fa qualcos'altro. Il problema è che non ho trovato un modo semplice (e ragionevolmente elegante) per farlo - non voglio doverlo separare carattere per carattere.
So che dev'essere facile ma non so come. Potrei farlo in una dozzina di lingue, ma non BASH!
Nella mia ricerca ho trovato questo:
Espressione regolare per verificare se una stringa è costituita da un numero reale valido in base 10
E c'è una risposta in essa che parla di regex, ma per quanto ne so, questa è una funzione disponibile in C (tra le altre). Tuttavia, aveva quella che sembrava un'ottima risposta, quindi l'ho provato con grep, ma grep non sapeva cosa farne. Ho provato -P che sulla mia scatola significa trattarlo come una regexp PERL - nada. Anche il trattino E (-E) non ha funzionato. E nemmeno -F.
Giusto per essere chiari, sto provando qualcosa di simile, cercando qualsiasi output - da lì, modificherò lo script per sfruttare tutto ciò che ottengo. (IOW, mi aspettavo che un input non conforme non restituisse nulla mentre una riga valida viene ripetuta.)
snafu=$(echo "$2" | grep -E "/^[-+]?(?:\.[0-9]+|(?:0|[1-9][0-9]*)(?:\.[0-9]*)?)$/")
if [ -z "$snafu" ] ;
then
echo "Not an integer - nothing back from the grep"
else
echo "Integer."
fi
Qualcuno potrebbe illustrare come è più facile farlo?
Francamente, questo è un difetto del TEST, secondo me. Dovrebbe avere una bandiera come questa
if [ -I "string" ] ;
then
echo "String is a valid integer."
else
echo "String is not a valid integer."
fi
[
è vecchio compatibiletest
;[[
è la novità di Bash, con più operazioni e diverse regole di citazione. Se hai già deciso di restare con Bash, prova[[
(è davvero molto più bello); se hai bisogno di portabilità ad altri gusci, evita[[
completamente.