[BASH] if e invio

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
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.
Avatar utente
Absolut
Linux 3.x
Linux 3.x
Messaggi: 1465
Iscritto il: gio feb 10, 2005 0:00
Slackware: current
Località: Roma

[BASH] if e invio

Messaggioda Absolut » gio giu 24, 2010 10:39

Ciao ragazzi,
nello script che sto scrivendo c'è una condizione IF

Codice: Seleziona tutto

if [ $pippo = y ]; then

ese

fi



il problema è che se digito qualsiasi carattere diverso da Y vado nel ciclo else. Se invece non digito nulla, ma premo solo invio mi viene fuori un unexpected operator.
Come gestisco l'invio in modo che vada ad eseguirsi il ciclo else?

grazie!

Avatar utente
danix
Staff
Staff
Messaggi: 3287
Iscritto il: ven ott 27, 2006 19:32
Nome Cognome: Danilo M.
Slackware: 64 14.1
Kernel: 4.4.0
Desktop: kde4
Località: Siderno (RC)
Contatta:

Re: [BASH] if e invio

Messaggioda danix » gio giu 24, 2010 10:50

potresti mettere un altro if annidato per verificare se $pippo sia vuoto, in tal caso gli assegni il valore predefinito che vuoi tu...
danix

myself ha scritto:non sono molto presente sul forum, e di ciò mi scuso con tutti

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

Re: [BASH] if e invio

Messaggioda Paoletta » gio giu 24, 2010 12:56

quota la variabile $pippo, in modo che se non contiene nulla verrà considerata una stringa vuota;

Codice: Seleziona tutto

if [ "$pippo" = "y" ]; then echo ciao; else echo mao;  fi

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6415
Iscritto il: gio nov 03, 2005 14:05
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: [BASH] if e invio

Messaggioda targzeta » gio giu 24, 2010 13:13

E' normale l'errore, ho usi il costrutto bash '[[' oppure usi '[' (in questo caso usi il comando test(1)). Generalmente si fa:

Codice: Seleziona tutto

if [ "x$pippo" = "xy" ]; then ... else ... fi
il tuo errore deriva dal fatto che se $pippo è null allora fai un controllo del tipo: = y che è un errore perche' l'operatore '=' implica due operandi e $pippo essendo null non esiste.

Emanuele
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà 

Avatar utente
Absolut
Linux 3.x
Linux 3.x
Messaggi: 1465
Iscritto il: gio feb 10, 2005 0:00
Slackware: current
Località: Roma

Re: [BASH] if e invio

Messaggioda Absolut » gio giu 24, 2010 14:40

spina ha scritto:E' normale l'errore, ho usi il costrutto bash '[[' oppure usi '[' (in questo caso usi il comando test(1)). Generalmente si fa:

Codice: Seleziona tutto

if [ "x$pippo" = "xy" ]; then ... else ... fi
il tuo errore deriva dal fatto che se $pippo è null allora fai un controllo del tipo: = y che è un errore perche' l'operatore '=' implica due operandi e $pippo essendo null non esiste.

Emanuele



Grazie mille... funziona perfettamente!

Avatar utente
ulisse89
Packager
Packager
Messaggi: 644
Iscritto il: sab gen 17, 2009 12:53
Nome Cognome: Riccardo
Slackware: 13.0
Kernel: 2.6.29.6
Desktop: Xfce
Località: Bologna

Re: [BASH] if e invio

Messaggioda ulisse89 » gio giu 24, 2010 15:01

spina ha scritto:E' normale l'errore, ho usi il costrutto bash '[[' oppure usi '[' (in questo caso usi il comando test(1)). Generalmente si fa:

Codice: Seleziona tutto

if [ "x$pippo" = "xy" ]; then ... else ... fi
il tuo errore deriva dal fatto che se $pippo è null allora fai un controllo del tipo: = y che è un errore perche' l'operatore '=' implica due operandi e $pippo essendo null non esiste.

Emanuele

Secondo me va bene come dice Paoletta, solo con il quote.
Non c'è bisogno d'aggiungere la x davanti.

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun set 03, 2007 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Re: [BASH] if e invio

Messaggioda Mario Vanoni » gio giu 24, 2010 18:53

ulisse89 ha scritto:
spina ha scritto:E' normale l'errore, ho usi il costrutto bash '[[' oppure usi '[' (in questo caso usi il comando test(1)). Generalmente si fa:

Codice: Seleziona tutto

if [ "x$pippo" = "xy" ]; then ... else ... fi
il tuo errore deriva dal fatto che se $pippo è null allora fai un controllo del tipo: = y che è un errore perche' l'operatore '=' implica due operandi e $pippo essendo null non esiste.

Emanuele

Secondo me va bene come dice Paoletta, solo con il quote.
Non c'è bisogno d'aggiungere la x davanti.

Con bash(1) hai ragione tu come pure la cara Paoletta.
Ma mi meraviglio, la sintassi di AT&T UNIX SVR2/3,
usata da tanti guru dei tempi, e che uso tutt'ora, era:

Codice: Seleziona tutto

if [ X${pippo} = Xy ]

Se pippo contiene caratteri "strambi",
con shell non bash, come finisce il test?

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6415
Iscritto il: gio nov 03, 2005 14:05
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: [BASH] if e invio

Messaggioda targzeta » gio giu 24, 2010 18:59

ulisse89 ha scritto:...Secondo me va bene come dice Paoletta, solo con il quote.
Non c'è bisogno d'aggiungere la x davanti.

Certo, non volevo smentire Paoletta. In effetti ho visto spesso la sintassi che ho descritto (che però ho scritto male perchè non ci vuole il quote) ma poi io faccio sempre come suggerito da Paoletta. L'importante è capire perchè si genera l'errore poi ognuno risolve come preferisce :).

Emanuele
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà 

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6415
Iscritto il: gio nov 03, 2005 14:05
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: [BASH] if e invio

Messaggioda targzeta » gio giu 24, 2010 19:07

Mario Vanoni ha scritto:...
Ma mi meraviglio, la sintassi di AT&T UNIX SVR2/3,
usata da tanti guru dei tempi, e che uso tutt'ora, era:

Codice: Seleziona tutto

if [ X${pippo} = Xy ]

Se pippo contiene caratteri "strambi",
con shell non bash, come finisce il test?

Ecco, appunto, io credo che quella fosse un vecchio modus operandi. C'è da dire che la bash è un po' particolare, ti permette di fare una espansione di parametro all'interno della quotatura "", magari e dico magari, se una volta questo non succedeva o se qualche shell ancora oggi non lo sopporta, allora non è possibile usare i quote per espandere una variabile e quindi ti tocca usare il vecchio stile x$var. Se poi guardi test(1) se ${pippo} non vale esattamente y il il test ritorna falso, inoltre se ${pippo} contiene uno spazio allora il test da errore dicendo che ci sono troppi parametri dato che se ne aspetta uno unario a destra e uno unario a sinistra dell'uguale, ed infatti l'errore iniziale è proprio quello, dato che pippo non è stata settata test(1) reclama l'assenza di un operatore unario a sinistra.

E ancora, per la bash si potrebbe usare il più veloce, poiché interno:

Codice: Seleziona tutto

if [[ "$pippo" == "y" ]]; then ... else ... ; fi

Emanuele
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà 

Avatar utente
ulisse89
Packager
Packager
Messaggi: 644
Iscritto il: sab gen 17, 2009 12:53
Nome Cognome: Riccardo
Slackware: 13.0
Kernel: 2.6.29.6
Desktop: Xfce
Località: Bologna

Re: [BASH] if e invio

Messaggioda ulisse89 » gio giu 24, 2010 19:14

Ho capito. In effetti senza quote ha più senso aggiungere la x.


Torna a “Programmazione”

Chi c’è in linea

Visitano il forum: Yahoo [Bot] e 2 ospiti