Repository 32bit  Forum
Repository 64bit  Wiki

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.

bash: if con condizione multipla

Messaggioda tom » mar giu 21, 2011 21:31

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

Re: bash: if con condizione multipla

Messaggioda zoros » mar giu 21, 2011 21:39

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 ...
Avatar utente
zoros
Linux 3.x
Linux 3.x
 
Messaggi: 1307
Iscritto il: lun mag 28, 2007 21:51
Località: Gorizia
Nome Cognome: Fabio∙Zorba
Slackware: 14.1
Kernel: 3.10.30-smp
Desktop: KDE-3.5(works!)

Re: bash: if con condizione multipla

Messaggioda tom » mar giu 21, 2011 21:46

funge, ma... non c'è un modo più "elegante"?
tom
Packager
Packager
 
Messaggi: 407
Iscritto il: dom nov 01, 2009 12:53
Nome Cognome: Tommaso D'Anna
Slackware: 13.37
Kernel: 2.6.37.6
Desktop: xfce

Re: bash: if con condizione multipla

Messaggioda zoros » mar giu 21, 2011 21:52

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

Re: bash: if con condizione multipla

Messaggioda targzeta » mer giu 22, 2011 0:42

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

Messaggioda targzeta » mer giu 22, 2011 0:55

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

Messaggioda Mario Vanoni » mer giu 22, 2011 8:53

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

Messaggioda targzeta » mer giu 22, 2011 18:04

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

Messaggioda zoros » mer giu 22, 2011 22:40

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

Re: bash: if con condizione multipla

Messaggioda targzeta » mer giu 22, 2011 22:55

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

Messaggioda zoros » mer giu 22, 2011 23:17

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

Re: bash: if con condizione multipla

Messaggioda masalapianta » gio giu 23, 2011 10:44

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
Avatar utente
masalapianta
Iper Master
Iper Master
 
Messaggi: 2775
Iscritto il: dom lug 24, 2005 23:00
Località: Roma
Nome Cognome: famoso porco
Kernel: uname -r
Desktop: awesome
Distribuzione: Debian

Re: bash: if con condizione multipla

Messaggioda Mario Vanoni » gio giu 23, 2011 18:07

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

Messaggioda Vito » gio giu 23, 2011 20:23

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
Vito
Staff
Staff
 
Messaggi: 4146
Iscritto il: mar dic 05, 2006 17:28
Località: Augsburg (DE)
Nome Cognome: Vito
Distribuzione: Linux Mint 17

Re: bash: if con condizione multipla

Messaggioda masalapianta » ven giu 24, 2011 9:45

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)
Avatar utente
masalapianta
Iper Master
Iper Master
 
Messaggi: 2775
Iscritto il: dom lug 24, 2005 23:00
Località: Roma
Nome Cognome: famoso porco
Kernel: uname -r
Desktop: awesome
Distribuzione: Debian

Prossimo

Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 0 ospiti