Pagina 1 di 1

[BASH] if e invio

Inviato: gio 24 giu 2010, 10:39
da Absolut
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!

Re: [BASH] if e invio

Inviato: gio 24 giu 2010, 10:50
da danix
potresti mettere un altro if annidato per verificare se $pippo sia vuoto, in tal caso gli assegni il valore predefinito che vuoi tu...

Re: [BASH] if e invio

Inviato: gio 24 giu 2010, 12:56
da Paoletta
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

Re: [BASH] if e invio

Inviato: gio 24 giu 2010, 13:13
da targzeta
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

Re: [BASH] if e invio

Inviato: gio 24 giu 2010, 14:40
da Absolut
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!

Re: [BASH] if e invio

Inviato: gio 24 giu 2010, 15:01
da ulisse89
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.

Re: [BASH] if e invio

Inviato: gio 24 giu 2010, 18:53
da Mario Vanoni
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?

Re: [BASH] if e invio

Inviato: gio 24 giu 2010, 18:59
da targzeta
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

Re: [BASH] if e invio

Inviato: gio 24 giu 2010, 19:07
da targzeta
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

Re: [BASH] if e invio

Inviato: gio 24 giu 2010, 19:14
da ulisse89
Ho capito. In effetti senza quote ha più senso aggiungere la x.