[Bash] check regex [RISOLTO] New problem bash!

Postate qui per tutte le discussioni legate a Linux in generale.

Moderatore: Staff

Regole del forum
1) Citare sempre la versione di Slackware usata, la versione del Kernel e magari anche la versione della libreria coinvolta. Questi dati aiutano le persone che possono rispondere.
2) Per evitare confusione prego inserire in questo forum solo topic che riguardano appunto Gnu/Linux in genere, se l'argomento è specifico alla Slackware usate uno dei forum Slackware o Slackware64.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Avatar utente
DaD
Linux 2.x
Linux 2.x
Messaggi: 371
Iscritto il: mer 7 feb 2007, 18:19
Nome Cognome: Antonio Barra
Slackware: 13
Kernel: 3.0
Desktop: KDE 4
Distribuzione: Mac OS X
Contatta:

[Bash] check regex [RISOLTO] New problem bash!

Messaggio da DaD »

Codice: Seleziona tutto

$ cat debug
#!/bin/bash

function tmp() {
      read -p  "Quanti valori deve contentere la tabella? " RIGHE_TB
      if [[ "$RIGHE_TB" =~ "^[0-9]+)$" ]]; then
          echo "Ok!"
      else
          echo "Devi inserire un numero!"
      fi
}

tmp
Ora è facile intuire che il valore di RIGHE_TB deve essere solo un valore numerico, ma il check che faccio fare alla variabile sembra non funzionare, perchè anche quando inserisco un numero, l'if mi restituisce l'esle ossia Devi inserire un numero!.
Cosa sbaglio? La regex è semplicissima e non credo ci siano errori li quindi dove diamine sta l'inghippo :(
Ultima modifica di DaD il lun 1 ott 2007, 16:51, modificato 1 volta in totale.

Avatar utente
Paoletta
Staff
Staff
Messaggi: 3975
Iscritto il: lun 25 apr 2005, 0:00
Slackware: 14.2 - 64 bit
Desktop: fluxbox
Località: Varese

Messaggio da Paoletta »

Codice: Seleziona tutto

#!/bin/bash

function tmp() {
      read -p  "Quanti valori deve contentere la tabella? " RIGHE_TB
      if [[ "$RIGHE_TB" -ge 0 ]]; then
          echo "Ok!"
      else
          echo "Devi inserire un numero!"
      fi
}

tmp
dai un'occhiata a man test

Avatar utente
DaD
Linux 2.x
Linux 2.x
Messaggi: 371
Iscritto il: mer 7 feb 2007, 18:19
Nome Cognome: Antonio Barra
Slackware: 13
Kernel: 3.0
Desktop: KDE 4
Distribuzione: Mac OS X
Contatta:

Messaggio da DaD »

Ehm ...

Codice: Seleziona tutto

$ ./debug
Quanti valori deve contentere la tabella? asd
Ok!
:?:

Avatar utente
cymon
Linux 2.x
Linux 2.x
Messaggi: 430
Iscritto il: ven 5 gen 2007, 1:40
Slackware: 13.1
Kernel: 2.6.33.4-smp
Desktop: Fluxbox
Località: Milano
Contatta:

Re: [Bash] check regex

Messaggio da cymon »

DaD ha scritto:

Codice: Seleziona tutto

$ cat debug
#!/bin/bash

function tmp() {
      read -p  "Quanti valori deve contentere la tabella? " RIGHE_TB
      if [[ "$RIGHE_TB" =~ "^[0-9]+)$" ]]; then
          echo "Ok!"
      else
          echo "Devi inserire un numero!"
      fi
}

tmp
Ora è facile intuire che il valore di RIGHE_TB deve essere solo un valore numerico, ma il check che faccio fare alla variabile sembra non funzionare, perchè anche quando inserisco un numero, l'if mi restituisce l'esle ossia Devi inserire un numero!.
Cosa sbaglio? La regex è semplicissima e non credo ci siano errori li quindi dove diamine sta l'inghippo :(
Sarà che la sintassi regexp bash mi fa sempre inciampare, ma la parentesi prima dell chiusura stringa a cosa serve?

Avatar utente
Paoletta
Staff
Staff
Messaggi: 3975
Iscritto il: lun 25 apr 2005, 0:00
Slackware: 14.2 - 64 bit
Desktop: fluxbox
Località: Varese

Messaggio da Paoletta »

DaD ha scritto:Ehm ...

Codice: Seleziona tutto

$ ./debug
Quanti valori deve contentere la tabella? asd
Ok!
:?:
ooops scusa sono andata di fretta...cavolo ma a

Codice: Seleziona tutto

 test -ge 
va bene tutto? comunque puoi usare questo workaround (visto che tanto vuoi solo numeri interi, ovviamente):

Codice: Seleziona tutto

function tmp() {
      read -p  "Quanti valori deve contentere la tabella? " RIGHE_TB
      ERRORE=`echo $RIGHE_TB | grep -o [^0-9]`
      if [ "$ERRORE" != "" ]; then
          echo "devi inserire un numero!"
      else
          echo "Ok"
      fi
}
comunque visto che "le tre grandi virtù di un programmatore: pigrizia, impazienza e arroganza" devo dire che prima ho seguito larry wall al 100%!

Avatar utente
DaD
Linux 2.x
Linux 2.x
Messaggi: 371
Iscritto il: mer 7 feb 2007, 18:19
Nome Cognome: Antonio Barra
Slackware: 13
Kernel: 3.0
Desktop: KDE 4
Distribuzione: Mac OS X
Contatta:

Messaggio da DaD »

Grazie paoletta ha funzionato ;)

Avatar utente
Paoletta
Staff
Staff
Messaggi: 3975
Iscritto il: lun 25 apr 2005, 0:00
Slackware: 14.2 - 64 bit
Desktop: fluxbox
Località: Varese

Messaggio da Paoletta »

DaD ha scritto:Grazie paoletta ha funzionato ;)
ok, questo vuol dire che devi dare un'occhiata a man grep :p ;)

Avatar utente
DaD
Linux 2.x
Linux 2.x
Messaggi: 371
Iscritto il: mer 7 feb 2007, 18:19
Nome Cognome: Antonio Barra
Slackware: 13
Kernel: 3.0
Desktop: KDE 4
Distribuzione: Mac OS X
Contatta:

Messaggio da DaD »

Paoletta ha scritto:
DaD ha scritto:Grazie paoletta ha funzionato ;)
ok, questo vuol dire che devi dare un'occhiata a man grep :p ;)
Sapveo che anche con grep potevo usare le regex ma sinceramnete non avevo pensato al suo utilizzo in questo caso :P
comunque ho un altro problemino e visto che si tratta sempre di uno script bash posto qui senza aprire una nuova discussione :]

In pratica ho quest'array $TYPE, che contiene come tutti gli array svariati volori, ora tramite un read l'utente inserisce una variabile che deve corrispondere ai valori contenuti nell'array $TYPE, bene mi dico, basterà un case che come ozpione primaria abbia il contenuto dell'array ed allor aho creato la voce in questa maniera:

Codice: Seleziona tutto

${TYPE[@]:0}) echo "ok" ;;
Ho pensato che questo potesse andare bene perchè se faccio un echo con quel codice mi vengono stampati tutti i valori dell'array, però se lo inserisco nell'opzione del case, mi da come buona solo il primo valore dell'array, e non ho ancora capito il perchè ...

In pratica potrei risolvere inserendo all'interno del case tutti i valori dell'array, ma questa soluzione mi sembra troppo poco professionale, e poi se l'array dovesse raggiungere una dimensione cospiqua di dati la trasposizione nel case sarebbe massacrante e la programmazione deve essere divertente non massacrante :lol:

P.S. Ecco il codice incriminato, (se potesse servire alla risoluzione del problema:

Codice: Seleziona tutto

function type_insert_check() {
      TYPE=(
             "INT"      # [0]
             "CHAR"     # [1]
             "VARCHAR"  # [2]
             "DATE"     # [3]
            )
      read -p  "Inserisci il tipo di volaore che assumerà *Nome*: " TYPE_R
      case $TYPE_R in
        ${TYPE[@]:0}) echo "ok" ;;
        *) echo "Non va bene ..." ;;
      esac
}

Rispondi