bash: if con condizione multipla

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.
tom
Packager
Packager
Messaggi: 407
Iscritto il: dom 1 nov 2009, 12:53
Nome Cognome: Tommaso D'Anna
Slackware: 13.37
Kernel: 2.6.37.6
Desktop: xfce

bash: if con condizione multipla

Messaggio da tom »

vorrei creare in uno script una condizione multipla con "if ... then" di questo tipo:

Codice: Seleziona tutto

ARGOMENTO=$1
if [ $ARGOMENTO = "A" oppure "B"] ; then
  echo SI
else
  echo NO
fi
praticamente otterrei il mio risultato utilizzando case, così:

Codice: Seleziona tutto

ARGOMENTO=$1
case $ARGOMENTO in
  A|B) echo SI ;;
    *) echo NO ;;
esac
però ho bisogno di usare if-then, come faccio?

Avatar utente
zoros
Linux 4.x
Linux 4.x
Messaggi: 1334
Iscritto il: lun 28 mag 2007, 22:51
Nome Cognome: Fabio`Zorba`
Slackware: 14.1
Kernel: 3.10.30-smp
Desktop: KDE-3.5(works!)
Località: Gorizia
Contatta:

Re: bash: if con condizione multipla

Messaggio da zoros »

forse così ... ma attenzione agli spazi ;)

Codice: Seleziona tutto

ARGOMENTO=$1
if [  "a$ARGOMENTO" == "aA" ] || [  "a$ARGOMENTO" == "aB" ] ; then
  echo SI
else
  echo NO
fi
vorrei riavere le mie firme ...

tom
Packager
Packager
Messaggi: 407
Iscritto il: dom 1 nov 2009, 12:53
Nome Cognome: Tommaso D'Anna
Slackware: 13.37
Kernel: 2.6.37.6
Desktop: xfce

Re: bash: if con condizione multipla

Messaggio da tom »

funge, ma... non c'è un modo più "elegante"?

Avatar utente
zoros
Linux 4.x
Linux 4.x
Messaggi: 1334
Iscritto il: lun 28 mag 2007, 22:51
Nome Cognome: Fabio`Zorba`
Slackware: 14.1
Kernel: 3.10.30-smp
Desktop: KDE-3.5(works!)
Località: Gorizia
Contatta:

Re: bash: if con condizione multipla

Messaggio da zoros »

tom ha scritto:funge, ma... non c'è un modo più "elegante"?
probabilmente sì ... comunque le varie shell sono piene di bachi ... per esempio la "a" davanti alla variabile serve ad evitare che sia rilevato un errore nel caso di variabile nulla #-o
vorrei riavere le mie firme ...

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6563
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 con condizione multipla

Messaggio da targzeta »

Vedi test(1), la bash ha altri suoi test, però questi sono quelli standard. In particolare potresti fare:

Codice: Seleziona tutto

[ ! -z $ARGOMENTO ] && [ $ARGOMENTO = 'A' -o $ARGOMENTO = 'B' ]
Nota che puoi fare dei test su stringhe, numeri e file.

Emanuele

P.S. Se un argomento non dev'essere espanso, non quotarlo con i doppi apici, usa l'apice singolo.
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: 6563
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 con condizione multipla

Messaggio da targzeta »

zoros ha scritto:probabilmente sì ... comunque le varie shell sono piene di bachi ... per esempio la "a" davanti alla variabile serve ad evitare che sia rilevato un errore nel caso di variabile nulla #-o
Non so a quali bachi ti riferisci, però quello che citi non è un bug, ma il comportamento corretto. Se tu esegui un controllo del tipo:

Codice: Seleziona tutto

[ $a -eq 1 ]
ma poi la variabile 'a' non è settata, l'espansione del controllo (il test che viene veramente effettuato) diventa:

Codice: Seleziona tutto

[ -eq 1]
e quindi il comando 'test' lamenta l'assenza di un argomento. O meglio, ti dice che hai effettuato un test unario (gli hai dato un solo argomento) ma che gli hai passato un operatore binario (il test '-eq'). Lui ovviamente ti dice che, avendogli passato un unico argomento, si aspettava un operatore unario.

Spero di essermi spiegato bene :D,
Emanuele

P.S. E comunque l'eventuale 'lamentela' non viene neanche dalla shell, ma dal comando 'test'. Quindi hai sbagliato proprio esempio :lol:
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à 

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 con condizione multipla

Messaggio da Mario Vanoni »

spina ha scritto: P.S. E comunque l'eventuale 'lamentela' non viene neanche dalla shell, ma dal comando 'test'. Quindi hai sbagliato proprio esempio :lol:
test e [ sono bash built-in, il comando si trova in
/bin/test
/usr/bin/test
/usr/X11R6/bin/test

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6563
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 con condizione multipla

Messaggio da targzeta »

Hai ragione! Non ho controllato, ma credo che quello builtin dovrebbe comportarsi come quello in /bin/, ma a rigore a questo punto il manuale da controllare è quello della bash e non di test.

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
zoros
Linux 4.x
Linux 4.x
Messaggi: 1334
Iscritto il: lun 28 mag 2007, 22:51
Nome Cognome: Fabio`Zorba`
Slackware: 14.1
Kernel: 3.10.30-smp
Desktop: KDE-3.5(works!)
Località: Gorizia
Contatta:

Re: bash: if con condizione multipla

Messaggio da zoros »

spina ha scritto:
zoros ha scritto:probabilmente sì ... comunque le varie shell sono piene di bachi ... per esempio la "a" davanti alla variabile serve ad evitare che sia rilevato un errore nel caso di variabile nulla #-o
Non so a quali bachi ti riferisci, però quello che citi non è un bug, ma il comportamento corretto. ...
è scritto anche in alcuni libri di riferimento GNU/Linux che le shell sono piene di bug ... ma, si sa, i libri sono pieni di bug #-o ... comunque l'interpretazione del testo nelle varie shell che abbiamo a disposizione fa veramente pena, basta uno spazio dimenticato e compaiono errori assurdi ... la questione di cui parlo sopra sarà anche nornale ... ma non puoi dire che è "normale" ;) ...
vorrei riavere le mie firme ...

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6563
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 con condizione multipla

Messaggio da targzeta »

Non volevo dire che le shell non hanno bachi, mi limitavo solo all'esempio riportato, visto che non è un baco :D.

Comunque:
zoros ha scritto:... la questione di cui parlo sopra sarà anche nornale ... ma non puoi dire che è "normale" ;) ...
ti meriti una vecchia citazione:
I computer non fanno ciò che vuoi, ma ciò che gli dici di fare!
:lol:

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
zoros
Linux 4.x
Linux 4.x
Messaggi: 1334
Iscritto il: lun 28 mag 2007, 22:51
Nome Cognome: Fabio`Zorba`
Slackware: 14.1
Kernel: 3.10.30-smp
Desktop: KDE-3.5(works!)
Località: Gorizia
Contatta:

Re: bash: if con condizione multipla

Messaggio da zoros »

spina ha scritto:Non volevo dire che le shell non hanno bachi, mi limitavo solo all'esempio riportato, visto che non è un baco :D.

Comunque:
zoros ha scritto:... la questione di cui parlo sopra sarà anche nornale ... ma non puoi dire che è "normale" ;) ...
ti meriti una vecchia citazione:
I computer non fanno ciò che vuoi, ma ciò che gli dici di fare!
:lol:

Emanuele
il problema non sono i computer, ma gli umani ... dopo aver faticato a capire le mille "trappole" della bash, ci sembra giusto così ... quindi andiamo avanti così ... ma non è proprio giusto così ;) ...
vorrei riavere le mie firme ...

Avatar utente
masalapianta
Iper Master
Iper Master
Messaggi: 2775
Iscritto il: lun 25 lug 2005, 0:00
Nome Cognome: famoso porco
Kernel: uname -r
Desktop: awesome
Distribuzione: Debian
Località: Roma
Contatta:

Re: bash: if con condizione multipla

Messaggio da masalapianta »

zoros ha scritto:comunque l'interpretazione del testo nelle varie shell che abbiamo a disposizione fa veramente pena, basta uno spazio dimenticato e compaiono errori assurdi ... la questione di cui parlo sopra sarà anche nornale ... ma non puoi dire che è "normale" ;) ...
pensa che nei bonifici basta uno zero in più ed invece di pagare cento euri ne pago mille, mica è normale questa cosa, le macchine dovrebbero leggerci nel pensiero e fare quello che vorremmo fare e non quello che gli diciamo di fare

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 con condizione multipla

Messaggio da Mario Vanoni »

spina ha scritto:Hai ragione! Non ho controllato, ma credo che quello builtin dovrebbe comportarsi come quello in /bin/, ma a rigore a questo punto il manuale da controllare è quello della bash e non di test.
Per curiosita` mia ho confrontato i due manuali, test(1) non capisce le opzioni/operatori di bash(1):
-N
-o
==
<
>

Poi da non dimenticare
/bin/[
/usr/bin/[
/usr/X11R6/bin/[
dai tempi di UNIX, altra variante di test.

Avatar utente
Vito
Staff
Staff
Messaggi: 4180
Iscritto il: mar 5 dic 2006, 17:28
Nome Cognome: Vito
Desktop: MacOS
Località: Monaco (DE)
Contatta:

Re: bash: if con condizione multipla

Messaggio da Vito »

masalapianta ha scritto: pensa che nei bonifici basta uno zero in più ed invece di pagare cento euri ne pago mille, mica è normale questa cosa, le macchine dovrebbero leggerci nel pensiero e fare quello che vorremmo fare e non quello che gli diciamo di fare
Questo tipo di risposte non sono apprezzate,
soprattutto perchè inutili ai fini della risoluzione del problema.
Evitiamole.
"Stat rosa pristina nomina, nomina nuda tenemus." [ Umberto Eco - Il nome della rosa]

"Faber est suae quisque fortunae ." [ Appio Claudio Cieco]

Avatar utente
masalapianta
Iper Master
Iper Master
Messaggi: 2775
Iscritto il: lun 25 lug 2005, 0:00
Nome Cognome: famoso porco
Kernel: uname -r
Desktop: awesome
Distribuzione: Debian
Località: Roma
Contatta:

Re: bash: if con condizione multipla

Messaggio da masalapianta »

Vito ha scritto:
masalapianta ha scritto: pensa che nei bonifici basta uno zero in più ed invece di pagare cento euri ne pago mille, mica è normale questa cosa, le macchine dovrebbero leggerci nel pensiero e fare quello che vorremmo fare e non quello che gli diciamo di fare
Questo tipo di risposte non sono apprezzate,
soprattutto perchè inutili ai fini della risoluzione del problema.
Evitiamole.
se ci fosse un problema avresti ragione, ma visto che la risposta corretta al problema posto da chi ha aperto il thread era gia stata fornita, non vedo il problema; di più, esaurito quel problema, chi ha aperto il thread ne ha posto un altro ("è un bug o meno che la bash si comporti in tal maniera?"), quindi la mia risposta era volta a far capire che non si può considerare un bug il fatto che un programma faccia quel che gli dici di fare e non quello che vorresti che facesse (poi ovviamente ci può sempre essere qualcuno che, quando c'era l'offerta sull'ironia, ha preferito dirigersi al banco dei salumi, ma di questo onestamente non posso farmene carico io)

Rispondi