Newsgroup: it.comp.os.linux.iniziare
Titolo: esercizio script bash

ciao al gruppo.
da una guida reperita copio/incollo un piccolo esercizio bash. il copia/
incolla sara' molto piu' esauriente di ogni mia parola:
16.2. Redirigere blocchi di codice
   Anche i blocchi di codice, come i cicli while, until e for,
   nonché i costrutti di verifica if/then, possono prevedere la
   redirezione dello stdin. Persino una funzione può usare questa
   forma di redirezione (vedi Esempio 23-11). L'operatore <,
   posto alla fine del blocco, svolge questo compito.
   Esempio 16-5. Ciclo while rediretto
#!/bin/bash
# redir2.sh
if [ -z "$1" ]
then
  Nomefile=nomi.data        #  È il file predefinito, se non ne viene
                            #+ specificato alcuno.
else
  Nomefile=$1
fi
#+ Nomefile=${1:-nomi.data}
#  può sostituire la verifica precedente (sostituzione di parametro).
conto=0
echo
while [ "$nome" != Smith ]  #  Perché la variabile $nome è stata usata
                            #+ con il quoting?
do
  read nome                 # Legge da $Nomefile invece che dallo stdin
  echo $nome
  let "conto += 1"
done <"$Nomefile"           # Redirige lo stdin nel file $Nomefile.
#    ^^^^^^^^^^^^
echo; echo "$conto nomi letti"; echo
exit 0
+++++++++++++++++++++
non c'e' verso che funzioni sulla mia slac 13.0 . Inizialmente pensavo di 
compiere errori di digitazione. tuttavia neppure copia/incolla 
restituisce uno script funzionante. Mi aspetto che tale scriptino legga 
Nomefile e mi visualizzi riga per riga quanto legge. invece lancio lo 
script, la cpu va' al 100% e nulla accade. monitor buio.
dove' l'errore ?
grazie

 dove' l'errore ?
A me va cosi` com'e`... dubbio: il tuo file nomi.data [o quello che
passi allo script] contiene la riga Smith? altrimenti il ciclo while non
si ferma... :-)
Ciao ciao
Claudio

 dove' l'errore ?
Prova a mettere "Smith" all'interno della lista "nomidata",
altrimenti non esce dal ciclo...
Ho provato ad aggiungere due "read" di controllo, prima e
dopo il ciclo while che di fatto non servono a nullaltro se
non ad assicurami che il problema stesse nel ciclo.
Inoltre mettendo come primo comando "set -x" o comunque
collocato prima del ciclo dovresti vedere piů chiaramente
cosa sta combinando lo script.
Ecco cosa succede:
root@slax:~# cat nomi.data
pippo
pluto
qui quo qua
paperone
paperino
Smith
root@slax:~# ./
script.elena.sh
inizio-ciclo-while_premi-invio
pippo
pluto
qui quo qua
paperone
paperino
Smith
fouri-ciclo
6 nomi letti
Ma il problema mi pare evidente che sia dovuto all'assenza
della condizione d'uscita dal ciclo.
Ci si potrebbe aspettare che terminato il file di input, il
ciclo uscisse preseguendo l'ultimo pezzo di script, tuttavia
a quanto pare non č cosě.
Per farlo dovrebbe funzionare qualcosa come:
_______
conto=0
while read "nome"
do
  echo "$nome"
  conto=$(($conto+1))
  [ "$nome" = "Smith" ] && break
done < $Nomefile
________________
In questo modo funziona anche se la lista NON contiene
"Smith", inoltre se lo trova, non prosegue nella lettura del
file, ma esce dal ciclo (col break). E prosegue con l'ultimo
pezzo dello script dandoti il resoconto.
Penso che il quoting della variabile "nome" abbia a che fare
con i nomi che contengono spazi, tipo "John Smith", nella
mia lista ho messo "qui quo qua" e col quoting lo prende
come un nome unico, giustamente perchč č su una riga, non ho
provato ad ommettere il quoting... Visto che č un esercizio
tuo e non mio... ti tocca provare a toglierlo e vedere cosa
succede.  ;-)
Ecco cosa accade ora con la variante sopra riportata, nel
caso in cui la lista non contenga "Smith":
__________________________
root@slax:~# cat nomi.data
pippo
pluto
qui quo qua
paperone
paperino
root@slax:~# ./
script.ele2.sh
inizio-ciclo-while_premi-invio
pippo
pluto
qui quo qua
paperone
paperino
fouri-ciclo_premi-invio
5 nomi letti
____________
Saluti  :-)


Facebook: Massimo Bacilieri

 Certo che fare queste cose da root...
vaero vero, ma si tratta di un sistema particolare, ben
backuppato tra l'altro. In ogni caso situazione temporanea.
Comunque osservazione più che giusta:
"Don't try this at home!"  ;-)
Saluti!

 Claudio
grazie per la risposta e grazie anche a jhonny e crononauta.
effettivamente non c'era Smith nel file dei nomi :-(
mi vergogno profondamente, ho copiato bit X bit lo script di esempio e 
non guardavo l'altro file.
scusate .