Repository 32bit  Forum
Repository 64bit  Wiki

[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.

[BASH] if e invio

Messaggioda Absolut » gio giu 24, 2010 9: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
Absolut
Linux 3.x
Linux 3.x
 
Messaggi: 1465
Iscritto il: gio feb 10, 2005 0:00
Località: Roma
Slackware: current

Re: [BASH] if e invio

Messaggioda danix » gio giu 24, 2010 9:50

potresti mettere un altro if annidato per verificare se $pippo sia vuoto, in tal caso gli assegni il valore predefinito che vuoi tu...
Avatar utente
danix
Staff
Staff
 
Messaggi: 3280
Iscritto il: ven ott 27, 2006 18:32
Località: Siderno (RC)
Nome Cognome: Danilo M.
Slackware: 64 14.0
Kernel: 3.2.29
Desktop: fluxbox

Re: [BASH] if e invio

Messaggioda Paoletta » gio giu 24, 2010 11: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
Paoletta
Staff
Staff
 
Messaggi: 3907
Iscritto il: dom apr 24, 2005 23:00
Località: Varese
Slackware: 13.1
Desktop: fluxbox

Re: [BASH] if e invio

Messaggioda targzeta » gio giu 24, 2010 12: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
targzeta
Iper Master
Iper Master
 
Messaggi: 6195
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: [BASH] if e invio

Messaggioda Absolut » gio giu 24, 2010 13: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
Absolut
Linux 3.x
Linux 3.x
 
Messaggi: 1465
Iscritto il: gio feb 10, 2005 0:00
Località: Roma
Slackware: current

Re: [BASH] if e invio

Messaggioda ulisse89 » gio giu 24, 2010 14: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.
Avatar utente
ulisse89
Packager
Packager
 
Messaggi: 644
Iscritto il: sab gen 17, 2009 12:53
Località: Bologna
Nome Cognome: Riccardo
Slackware: 13.0
Kernel: 2.6.29.6
Desktop: Xfce

Re: [BASH] if e invio

Messaggioda Mario Vanoni » gio giu 24, 2010 17: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?
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

Re: [BASH] if e invio

Messaggioda targzeta » gio giu 24, 2010 17: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: 6195
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: [BASH] if e invio

Messaggioda targzeta » gio giu 24, 2010 18: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
targzeta
Iper Master
Iper Master
 
Messaggi: 6195
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: [BASH] if e invio

Messaggioda ulisse89 » gio giu 24, 2010 18:14

Ho capito. In effetti senza quote ha più senso aggiungere la x.
Avatar utente
ulisse89
Packager
Packager
 
Messaggi: 644
Iscritto il: sab gen 17, 2009 12:53
Località: Bologna
Nome Cognome: Riccardo
Slackware: 13.0
Kernel: 2.6.29.6
Desktop: Xfce


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite