[Soci SLIP] doppi apici in bash e ritorni a capo

Lucio Crusca lucio a sulweb.org
Ven 26 Ago 2011 10:12:56 CEST


In data venerdì 26 agosto 2011 09:42:33, Paolo Craveri ha scritto:
> perchè se racchiudo in doppi apici  (così: "`$a`") l'output ha i ritorni a
> capo ?

Perché gli apici proteggono i caratteri "strani" che altrimenti bash 
interpreterebbe nel modo che ritiene più opportuno. Fra questi caratteri 
"strani" c'è il ritorno a capo, che viene quindi mantenuto nella stringa che 
viene passata al comando echo. Diversamente il ritorno a capo, essendo 
contenuto nell'output di un altro comando e non essendo la conseguenza della 
pressione del tasto Invio, verrebbe rimosso da bash.

> 
> se poi faccio questo:
> ~/pippo$ for f in `$a`; do echo $f; done
> due
> tre
> uno
> ~/pippo$ for f in "`$a`"; do echo $f; done
> due tre uno
> 
> ...capisco ancor meno; ottengo un output che è esattamente il contrario di
> quanto mi sarei aspettato: perchè nel ciclo for..do la versione con "`$a`"
> non mantiene i ritorni a capo ? 

Perché bash separa gli elementi su cui fare l'iterazione del comando for sulla 
base degli spazi. Ovvero dove c'è uno spazio, che è il separatore, termina un 
elemento dell'iterazione ed inizia il successivo. In pratica essendo un for lo 
spazio diventa uno di quei caratteri "strani" che dicevo prima, soggetto ad 
interpretazione speciale da parte di bash. Se però ci sono le virgolette, lo 
spazio perde il suo significato di separatore ed il for esegue una sola 
iterazione sull'unica stringa formata da

due tre uno

spazi inclusi, virgolette escluse. Quindi quell'unica iterazione si comporta 
come il caso precedente (ovvero quando non c'era il for) senza virgolette.

Senza le virgolette nel for ottieni di nuovo i ritorni a capo perché il for 
esegue tre iterazioni, quindi tre comandi echo separati. Il comando echo per 
default, dopo aver stampato quello che deve, ritorna a capo. Se vuoi evitarlo 
devi aggiungere l'opzione -n al comando echo.





Maggiori informazioni sulla lista Soci