[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.
Rispondi
Avatar utente
Absolut
Linux 4.x
Linux 4.x
Messaggi: 1465
Iscritto il: gio 10 feb 2005, 0:00
Slackware: current
Località: Roma

[BASH] if e invio

Messaggio 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!

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

Re: [BASH] if e invio

Messaggio 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...
danix
myself ha scritto:non sono molto presente sul forum, e di ciò mi scuso con tutti

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

Re: [BASH] if e invio

Messaggio 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

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

Re: [BASH] if e invio

Messaggio 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
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 4.x
Linux 4.x
Messaggi: 1465
Iscritto il: gio 10 feb 2005, 0:00
Slackware: current
Località: Roma

Re: [BASH] if e invio

Messaggio 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!

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

Re: [BASH] if e invio

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

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 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

Messaggio 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?

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

Re: [BASH] if e invio

Messaggio 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
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: 6566
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: [BASH] if e invio

Messaggio 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
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: 643
Iscritto il: sab 17 gen 2009, 12:53
Nome Cognome: Riccardo
Slackware: 13.0
Kernel: 2.6.29.6
Desktop: Xfce
Località: Bologna

Re: [BASH] if e invio

Messaggio da ulisse89 »

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

Rispondi