Newsgroup: it.comp.os.linux.iniziare
Titolo: ciclo for con spazi ed a capo

Ciao,
avrei la segunete necessità ..ho un file di testo costituito da varie
righe con spazi e non,...es:
#####file.txt######
ciao
questo test
ciao bello
esempio
#####file.txt######
se creo il seguente script
####script.sh#####
for i in $(cat file.txt)
do
        echo  $i
done
####script.sh#####
mi capita che le righe costituite da + parole mi vanno a capo...invece
vorrei che la variabile $i venisse valorizzata con l'intera riga ...
sapete come potrei uscirmene ?
Grazie


Scusatemi ma ho fatto...
#!/bin/bash
cat file.txt | while read i
do
        echo  $i
done
cma accetto altri suggerimenti..
grazie

 sapete come potrei uscirmene ?
scrivendo solo:
cat file.txt

 
Dai, su, l'echo è un comando usato per testare lo script,
per essere sicuri di non fare danni, al 99%. ;-)
La risposta è usare read, o modificare il valore di IFS con "\n", ad
esempio.
-- 
           |Save our planet!
    Ciao   |Save wildlife!
   roberto |For your E-MAIL use ONLY recycled Bytes  !!
           |roberto poggi   
rpo...@softhome.net

 ...
Usa il while Luke!
while read -r i
 do
  echo "$i"
 done < file.txt
Nota le virgolette.

 Prima di tutto, scrivi in italiano.
Senti chi parla...rileggi i tuoi post prima di criticare gli altri.

 per essere sicuri di non fare danni, al 99%. ;-)
Proprio per questo è una stupidaggine.
Se si vuole risolvere un problema reale bisogna postare
il vero problema, non uno stupido esempio con echo che
non serve a nulla tranne che come cattivo esempio.
Tra l'altro questo problema specifico è stato discusso 
su questo gruppo innumerevoli volte; sarebbe bastato 
consultare google per risolvere al volo.

 Nota le virgolette.
sarei pda, se non fosse che anche io uso il termine "valorizzare una
variabile" per abbreviare "assgnare un valore ad una variabile"
cos' ha che non ti piace?


Ciao, non mi va di fare polemiche...ti ricordo che il gruppo si chiama
linux.iniziare ...
..e lesempio l'ho fatto solo per farmi capire nel + breve tempo
possibile... per quanto rigurada il mio italiano è daccordo con te
anehc la mia ex prof di italiano :) ....inoltre se ti da fastidio come
posto..puoi anche non rispondermi affatto ...con questo chiudo e
ringrazio come al solito a tutti per la disponibilità...
evviva l'opensource....

 cos' ha che non ti piace?
Lasciamo perdere "venire" al posto di "essere"; è un uso 
dialettale ma non crea molti problemi.
Il vero problema è che il "valorizzare" significa far 
aumentare il valore economico di un bene, e per traslato,
mettere in evidenza oppure far risaltare una cosa.
Nulla a che vedere con l'uso che fai tu.
Quindi meglio dire "assegnare il valore ad `$i'" o, se vuoi
abbreviare, dato che il contesto lo permette, "leggere `$i'".

 grazie
penso che vada piu' che bene cosi' ... se poi usi la variabile
virgolettata (;-)) e' ancora meglio
cat file.txt|while read; do
    echo "$REPLY"
done
ciao
-- 
Never try to teach a pig to sing.
It wastes your time and annoys the pig.

 ####script.sh#####
  Questo non va bene se capisco quello che vuoi.  Tu vorresti che la
variabile "i" assuma come valore, ad ogni ciclo, tanti cicli quante sono
le righe del file di testo, la stringa dell'intera i-esima riga del file
di testo.
  Ma il tuo script usa scorrettamente la variabile "i", perché succede che
a questa variabile sono assegnati i valori pari alle parole dello script.
 Insomma, è come facessi:
for i in ciao questo test ciao bello esempio
[...]
  Per convincertene, fai:
echo $(< file.txt)
che è la stessa cosa di echo $(cat file.txt) ma più veloce.  Vedrai questo:
ciao questo test ciao bello esempio
Quindi, invece di usare il costrutto $(< file.txt), che non ti da quello
che ti aspetti, devi usare qualcosa che lo faccia.  Hai più possibilità:
1) il già trovato comando read;
2) sed con il comando "p" (print);
3) awk con il comando print.
Di questi l'opzione (1) è senz'altro quella più veloce e semplice.
  Usando sed avresti:
sed -n p file.txt
ciao
questo test
ciao bello
esempio
  Mentre con awk avresti:
awk '{print}' file.txt
ciao
questo test
ciao bello
esempio
  E quindi:
for i in "$(sed -n p file.txt)" ; do echo "$i" ; done
ciao
questo test
ciao bello
esempio
oppure:
for i in "$(awk '{print}' file.txt)" ; do echo "$i" ; done
ciao
questo test
ciao bello
esempio
  ATTENTO ALLE VIRGOLETTE!
Guarda che succede se le dimentichi:
for i in $(sed -n p file.txt) ; do echo "$i" ; done
ciao
questo
test
ciao
bello
esempio
for i in $(awk '{print}' file.txt) ; do echo "$i" ; done
ciao
questo
test
ciao
bello
esempio
  Capire perché questo succede è lasciato come compito per lo studente.
:-)
  Ciao,
-- 
Alessandro Selli 
http://alessandro.route-add.net
AVVERTENZA: i messaggi inviati a "trappola" non mi arriveranno.
WARNING: messages sent to "trappola" will never reach me.
Chiave PGP/GPG: EC885A8B