[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