# bash per idioti (as I am) [aggirato]

## codadilupo

```
pippo=12345

if [ $pippo != " " ]  ; then

echo ciao $pippo

fi
```

risultato: ciao 12345

```
pippo=

if [ $pippo != " " ]  ; then

echo ciao $pippo

fi
```

risultato: ciao

mo', qualcuno me lo spiega come se avessi tre anni, chè son troppo stupido per capirlo da solo ?

CodaLast edited by codadilupo on Thu Jun 14, 2007 11:54 am; edited 1 time in total

----------

## crisandbea

mi sembra alquanto strano che il primo ti dia quell'output, in quanto $mobile non esiste da nessuna parte, quindi, a meno che quel $mobile non sia $pippo, non ti stamperÃ  mai i numeri dopo il ciao,  nel secondo invece dovrebbe darti errore in quanto manca di racchiudere il pippo tra " "  .

ciauzLast edited by crisandbea on Wed Jun 13, 2007 2:29 pm; edited 2 times in total

----------

## Guglie

non vorrei che sia stato phpbb, ma hai lo spazio fra le virgolette nell'if  :Wink: 

----------

## drizztbsd

 *codadilupo wrote:*   

> 
> 
> ```
> pippo=12345
> 
> ...

 

```
pippo=" "

if [ "$pippo" != " " ]  ; then

echo ciao $pippo

fi
```

----------

## codadilupo

con o senza spazio, non cambia nulla  :Sad: 

----------

## codadilupo

 *Drizzt Do` Urden wrote:*   

> 
> 
> ```
> pippo=" "
> 
> ...

 

ho messo l'espressione che riepie $pippo tra virgolette, ma non cambia nulla  :Sad: 

----------

## crisandbea

 *codadilupo wrote:*   

>  *Drizzt Do` Urden wrote:*   
> 
> ```
> pippo=" "
> 
> ...

 

per niente intendi che non ti stampa nulla ???

----------

## codadilupo

riformulo:

```
pippo=$(echo $riga | cut -f6 -d",")

if [ $pippo != " " ]  ; then

echo ciao $pippo

fi
```

sia che pippo restituisca qualcosa, sia che restituisca vuoto, non cambia nulla, anche se cambio pippo in 

```
pippo="$(echo $riga | cut -f6 -d",")"

```

o l'if in

```
if [ $pippo != "" ]  ; then

```

Coda

----------

## Guglie

 *Quote:*   

> ho messo l'espressione che riepie $pippo tra virgolette, ma non cambia nulla 

 

devi fare tutti e due: mettere fra virgolette e levare lo spazio

```
 if [ "$pippo" != "" ]
```

----------

## codadilupo

 *Guglie wrote:*   

>  *Quote:*   ho messo l'espressione che riepie $pippo tra virgolette, ma non cambia nulla  
> 
> devi fare tutti e due: mettere fra virgolette e levare lo spazio
> 
> ```
> ...

 

è già cosi'... ho provato tutte le combinazioni  :Wink: 

Coda

----------

## drizztbsd

ma te che devi fare esattamente?

----------

## skypjack

 *Drizzt Do` Urden wrote:*   

> ma te che devi fare esattamente?

 

Mi pare la domanda più azzeccata e il modo più veloce per risolvere, mi unisco alla richiesta...  :Wink: 

----------

## codadilupo

ho un file con i dati prelevati dall'active directory, e li devo scrivere in un file

es:

paolo.paperino,Paolino,Paperino,307,308,paolino.paperino@disney.it

zio.paperone,Zio,Paperone,307, ,zio.paperone@disney.it

ora, il terzo e quarto campo possono esistere o non esistere, nel qual caso, devo saltare la scrittura, onde evitare righe vuote. Lo script è pronto, solo, non mi riesce di capire come distinguere tra un campo vuoto e uno pieno

Coda

----------

## Luca89

a me così funziona:

```
!/bin/sh

pippo=12345

if [ "$pippo" != "" ]; then

    echo ciao $pippo

fi

pippo=

if [ "$pippo" != "" ]; then

    echo ciao $pippo

fi

```

```
[ ~ ] $ sh Dev/bin/prova.sh 

ciao 12345

[ ~ ] $

```

Se non va, devi salvare il contenuto della variabile $pippo quando credi che debba esser vuoto e veder cosa contiene realmente.

----------

## djinnZ

a parte le virgolette mi pare di capire che non sai se il campo è vuoto o meno quindi cut ti può restituire tanto " " quanto "". o mi sbaglio?

Quindi ti serve un 

```
[ -z "$pippo" ] && pippo=" "
```

 prima dell'if o devi usare un case o un if nidificato che sia.

[OT] la prossima volta vedi di usare qualcosa di meno antipatico dei prodotti di quegli stucchevoli idioti della disney per fare gli esempi.   :Wink: 

E poi un pippo.c lo ho già dovuto sopportare.[/OT]

----------

## codadilupo

 *Luca89 wrote:*   

> a me così funziona:
> 
> ```
> !/bin/sh
> 
> ...

 

cosi' funziona anche a me, ma se ottengo pippo uguale a nulla, lo stampa lo stesso, ed è proprio questo il problema!

CodaLast edited by codadilupo on Wed Jun 13, 2007 6:32 pm; edited 1 time in total

----------

## codadilupo

 *djinnZ wrote:*   

> a parte le virgolette mi pare di capire che non sai se il campo è vuoto o meno quindi cut ti può restituire tanto " " quanto "". o mi sbaglio?
> 
> Quindi ti serve un 
> 
> ```
> ...

 

il fatto è che ho provato sia a dire, ok, la riga mi fa un cut del campo che equivale a uno spazio, qundi verifico se è diverso da uno spazio, tanto quanto ho provato a verificare se fosse diverso da vuoto, ma non cambia nulla. Lo considera sempre pieno, e mi stampa una riga vuota (o piena di uno spazio). Tra l'altro, ho già testato i vari -e, -z, -x senza successo.

Domani provero' a usare congiuntamente -z e =" "  e vediamo che succede, ma non hanno funzionato mica, separati, e trovo assurdo che non sia possibile verificare semplicemente una condizione cosi' banale  :Razz: 

 *Quote:*   

> [OT] la prossima volta vedi di usare qualcosa di meno antipatico dei prodotti di quegli stucchevoli idioti della disney per fare gli esempi.  
> 
> E poi un pippo.c lo ho già dovuto sopportare.[/OT]

 

eh, usero' i personaggi di capitan harlock  :Razz: 

Coda

----------

## djinnZ

allora se sei assolutamente sicuro che può essere solo vuota, caratteri senza spazio o solo spazio usa -z $variabile senza virgolette e risolvi il problema alla radice. Me ne ero dimenticato ed ora mi sono accorto che è sh e non bash. In questo caso devi fare in confronto con -z o con '' non con "" (una volta sapevo pure il perchè, ma non mi viene a mente).

[OT]già qualcosa. Anche se arcaici. Si diventa vecchiotti?!   :Twisted Evil:   :Twisted Evil:   :Twisted Evil:  [/OT]

----------

## codadilupo

```
#!/bin/sh

riga="capitan.harlock,Capitan,Harlock,+39 20100.331, ,capitan.harlock@alkadia.com"

pippo=$(echo $riga | cut -f5 -d",")

if [ "$pippo" != " " ] ; then

echo $pippo

else

echo "la variabile è vuota"

fi
```

Provandolo da una bash 2.05b mi riporta:

```

la variabile è vuota
```

sia che metta uno spazio, sia che non ci sia lo spazio. E non capisco perchè sulla bash che ho al lavoro - una 3.1.7 -  sia differente.... bah!

P.S.: avevo provato a mettere anche #!/bin/bash ma nulla...

CodaLast edited by codadilupo on Wed Jun 13, 2007 6:51 pm; edited 1 time in total

----------

## codadilupo

 *djinnZ wrote:*   

> allora se sei assolutamente sicuro che può essere solo vuota, caratteri senza spazio o solo spazio usa -z $variabile senza virgolette e risolvi il problema alla radice. Me ne ero dimenticato ed ora mi sono accorto che è sh e non bash. In questo caso devi fare in confronto con -z o con '' non con "" (una volta sapevo pure il perchè, ma non mi viene a mente).

 

la variabile puo' contenere sia numeri con spazi, che nulla

 *Quote:*   

> [OT]già qualcosa. Anche se arcaici. Si diventa vecchiotti?!     [/OT]

 

non sono io che son vecchio. Son gl'altri che son troppo giovani  :Razz: 

Coda

----------

## djinnZ

[ -z $variabile ] è vero anche se la variabile contiene uno spazio (messo che non cambi la variabile IFS, ovviamente). Nel confronto != è come se non avessi fornito alcun parametro. [ -z $variabile ] è la stessa cosa che scrivere "test -z $variabile".

Se lavori in sh il confronto alla variabile vuota lo puoi fare solo come [ "$varibile" != '' ].

Oppure cambi quel #!/bin/sh in #!/bin/bash e puoi fare anche il confronto [ "$variabile" != "" ].

Alle volte ho il dono di essere incomprensibile.

Edit: ovviamente se capita per errore o per idiozia che possa restituirti un "capitan harlock@alkadia.com" il test [ -z $varaibile] ti restituirà errore questo intendevo.

[OT] Vecchio, vecchiaccio incartapecorito, non mi negare che un paio delle prime puntate di goldrake te lo ricordi in BN.   :Twisted Evil:  Ovviamente io si quindi mi permetto di sfottere.   :Crying or Very sad:  [/OT]

----------

## codadilupo

quindi 

```
if [ -z $variabile ] ; then

echo variabile

fi
```

deve stampare solo se la variabile è piena, giusto ?

Ci riprovero', domani al lavoro. Qui a casa funziona tutto secondo i piani  :Razz: 

Coda

----------

## Guglie

 *codadilupo wrote:*   

> sia che metta uno spazio, sia che non ci sia lo spazio. E non capisco perchè sulla bash che ho al lavoro - una 3.1.7 -  sia differente....

 

da me funziona con bash-3.2_p15-r1 ..

----------

## codadilupo

 *djinnZ wrote:*   

> Edit: ovviamente se capita per errore o per idiozia che possa restituirti un "capitan harlock@alkadia.com" il test [ -z $varaibile] ti restituirà errore questo intendevo.

 

ach! E' un problema. Quando la variabile è piena, contiene anche spazi!

 *Quote:*   

> [OT] Vecchio, vecchiaccio incartapecorito, non mi negare che un paio delle prime puntate di goldrake te lo ricordi in BN.   Ovviamente io si quindi mi permetto di sfottere.   [/OT]

 

solo perchè era in B/N il televisore di cucina, mica perchè perchè era B/N la trasmissione TV  :Razz:  ! 

Coda

----------

## djinnZ

Ho trovato l'ultimo errore:

```

pippo="$(echo $riga | cut -f5 -d",")"
```

o usi gli apici inversi (l'unico caso in cui sono necessari). Altrimenti con alcune versioni ti ritrovi una variabile vuota se il risultato è spazio.

E poi vanno a dire che la bourne shell è facile da usare e soprattutto è ben documentata...  :Evil or Very Mad: 

[/OT]nella prima trasmissione di goldrake un paio di episodi li trasmisero in BN tanto i televisori a colori non erano tanto diffusi e se ne accorsero in  pochi.[/OT]

----------

## codadilupo

 *djinnZ wrote:*   

> Ho trovato l'ultimo errore:
> 
> ```
> 
> pippo="$(echo $riga | cut -f5 -d",")"
> ...

 

nella versione originale gl'apici non c'erano  :Wink: 

 *Quote:*   

> [/OT]nella prima trasmissione di goldrake un paio di episodi li trasmisero in BN tanto i televisori a colori non erano tanto diffusi e se ne accorsero in  pochi.[/OT]

 

uh!, santapolenta  :Wink: 

Coda

----------

## codadilupo

ho capito!

```
#!/bin/sh

riga="capitan.harlock,Capitan,Harlock,+39 20100.331, ,capitan.harlock@alkadia.com"

pippo=$(echo $riga | cut -f5 -d",")

if [ "$pippo" != " " ] ; then

echo $pippo

else

echo "la variabile è vuota"

fi

```

risultato: la variabile è vuota

```
#!/bin/sh

riga="capitan.harlock,Capitan,Harlock,+39 20100.331,capitan.harlock@alkadia.com, "

pippo=$(echo $riga | cut -f6 -d",")

if [ "$pippo" != " " ] ; then

echo $pippo

else

echo "la variabile è vuota"

fi

```

risultato: una riga vuota

Ancora pero' non so perchè!

EDIT: al momento ho risolto invertendo quinto e sesto campo, ma vorrei davvero capire il motivo di questo comportamento

Coda

----------

