Newsgroup: it.comp.os.linux.sys
Titolo: bash e ciclo for

Ho un problemino con uno script bash:
Faccio un ls -l e voglio stampare per ogni riga dell'output, solo i 
permessi directory:
#!/bin/bash
for i in `ls -l`; do
	echo -n $i|cut -f1
done
Solo che cosě mi stampa tutti i campi sulla prima riga.
Idee?
Grazie a tutti

 Solo che cosě mi stampa tutti i campi sulla prima riga.
Perchč il separatore tra campi č lo spazio, non l'accapo...

 done
Prova con:
#!/bin/bash
for i in `ls -l | cut -d" " -f1`; do
        echo "$i"
done

 Solo che cosě mi stampa tutti i campi sulla prima riga.
ls -l | cut -d " " -f 1       

 Solo che così mi stampa tutti i campi sulla prima riga.
L'opzione -n non mette il newline dopo la stringa.
$ man echo
Ciao
Giovanni
-- 
   A computer is like an air conditioner,
   it stops working when you open Windows.
   Registered Linux user #337974  < 
http://giovanni.homelinux.net/
 >

 Perchč il separatore tra campi č lo spazio, non l'accapo...
Ok. Ho impostato la variabile $IFS con "<LF>" e cosě mi stampa le righe 
"quasi" correttamente. Dico quasi perchč se ci sono righe che contengono 
L o F me li taglia, e non capisco perchč.

 
scusa se non posto la mia soluzione che sarebbe comunque uguale a quella di
altri che ti hanno gia' risposto. la mia e' solo una curiosita'; a cosa ti
serve una cosa del genere? si tratta di un piccolo esercizio di scripting
oppure ti serve per qualcosa di concreto (la cosa mi pare strana perche' la
mancata associazione <nome_file_> - <permessi> e', almeno per me, piuttosto
insolita)?
-- 
Pandozy vede tutto
    _   _
  O'|,=,/'O
    (0 0)
ooO--(_)--Ooo

 almeno per me, piuttosto insolita)?
Come dicevo a Skull, sto creando uno script e procedo a piccoli passi. 
Ciň che devo fare č: ho un file con diverse righe e per ogni riga diversi 
campi. Dovrei prendere il primo campo per ogni riga e farne un controllo 
con IF per verificare determinate condizioni.
Solo che con un ciclo for non riesco a prendere una riga per volta, e 
quando ci riesco i campi non sono per niente formattati come voglio.

DzU ha scritto:

IFS si imposta a NL come sotto
(
IFS=$'\n'
for i in $(ls -l); do
	echo $i
done
)
mantieni le parentesi tonde che ho messo per far girare il for su una 
subshell, in modo che la var IFS torni al vecchio valore all'uscita del 
ciclo - senza doverla memorizzare su una var temporanea
ciao
-- 
Cybertoldo
Per rispondermi via email, sostituisci moc.liamg con 
gmail.com

 con IF per verificare determinate condizioni.
Suggerirei caldamente l'uso di awk o perl, per queste cose.
Non che in bash non lo fai, ma su tante cose finisci per rovinarti la
vita (oppure ad usare qui e lì pezzi di awk e/o perl :-D)...

 )
Ok, funziona perfettamente.
Un paio di cose non mi sono chiare:
1. IFS=$'\n': la funzione del $ qual č?
2. nel ciclo for il significato di racchiudere il comando tra $().
Grazie mille

 quando ci riesco i campi non sono per niente formattati come voglio.
Ma perché ti ostini a chiedere se la tua soluzione è corretta invece che
esporre il problema e chiedere direttamente la soluzione migliore?
Per esempio una base di partenza per il tuo problema è questo:
ls -l | tail -n +2 | while read perm link user group size date time name
do
    printf '%-30s %7d %-10s\n' "$name" "$size" "$user"
done
-- 
Flavio Visentin
Scientists have finally discovered what's wrong with the female brain:
On the left side, there is nothing right, and on the right side, there
is nothing left.

 2. nel ciclo for il significato di racchiudere il comando tra $().
vd. capitolo 11


 
http://tldp.org/LDP/abs/html/
Ho trovato tutto. 
Grazie mille a tutti, gentilissimi.