Newsgroup: it.comp.os.linux.iniziare
Titolo: /bin/sh (non bash) ciclo while e variabili locali/globali

Ho un ciclo while:
 
 
#!/bin/sh
echo "$P" | while read N G
do
        # cose varie
        C=$(( $C + $N ))
        T=$(( $T + 1 ))
done
echo "$C $T"
 
 
 
 
La variabile $P é composta da alcune righe contenenti un valore numerico ed una
stringa, tipo:
 
4 pippo
6 pluto
1 paperino
...
 
La cariabile $C contiene la somma dei valori numerici, mentre la variabile $T
contiene il numero delle righe.
 
All'interno del ciclo while (che lavora in una subshell a causa del "pipe") le
variabili funzionano, ma non so come esportarle fuori dal ciclo...
 
 
 
-- 
+---------------------------------------------------------------------------+
| Benventi sull'autostrada Milano Cavenago Trezzo Capriate Dalmine Bergamo  |
|  Seriate Grumello Oglio Palazzolo Rovato Ospitaletto Brescia Desenzano    |
|Sirmione Peschiera Sommacampagna Verona Soave Montebello Montecchio Vicenza|
+-----#9---------------------Campagna contro le pubblicita` idiote.---------+

 variabili funzionano, ma non so come esportarle fuori dal ciclo...
 
Per prima cosa, da me /bin/sh e` un link a /bin/bash,
quindi le due coso sono la stessa.
 
Secondo, non credo sia possibile "esportare" da un
processo figlio ad uno padre, ma solo il contrario.
 
D'altro canto, se il problema e` *solo* stampare il
risultato:
 
#!/bin/sh
 
echo "$P" | while read N G
do
        # cose varie
        C=$(( $C + $N ))
        T=$(( $T + 1 ))
	echo "$C $T"
done | tail -1
 
Altrimenti, se c'e` di piu`, forse conviene usare
qualche tool un po' (poco) piu` avanzato come "awk"
o "gawk".
 
bye,
 
-- 
 
piergiorgio

 o "gawk".
 
Purtroppo non devo stampare solo il risultato...
 
Usando /bin/bash, se ne esce (ma bash l'ho sempre considerato pesante per fare
script) eliminando il pipe iniziale e mettendo la variabile $P alla fine, dopo
il "done" con una redirezione  <<< "$P".
Con la dash non va (Syntax error: redirection unexpected), provato (magari
passeró a dixan!).
 
La parte dello script che ho indicato é un pezzo di uno mooolto piú voluminoso
(sono 40k abbondanti).
Vorrá dire che mi toccherá metterci mano e riguardarlo tutto!
 
-- 
+---------------------------------------------------------------------------+
| >Antonio wrote:                                                           |
| >Salve, se ho un numero di ip , come posso entrare e che prg. devo usare  |
| >per l'ingresso grazie 1000                                               |
| Buitoni EasyCracker 0.7.1                                                 |
+-----#12-----------------------Campagna contro bimbiminkia idioti.---------+

 script) eliminando il pipe iniziale e mettendo la variabile $P alla fine, dopo
 
Hai considerato male.
Come sarebbe "pesante"?
Hai fatto benchmark significativi?
 
Lascia perdere ed usa "bash", va benissimo.
 
bye,
 
-- 
 
piergiorgio

Piergiorgio Sartor in data 14:41, domenica 23 luglio 2017, nel gruppo
it.comp.os.linux.iniziare ha scritto:

Pesante, nel senso che é grande oltre 800k, mentre sh (dash) solo poco piú di
150k.
Non avendo necessitá, in uno script di tanti fronzoli, non ho mai usato bash.
Abitudine.
 
 
-- 
94% dei calcolatori hanno lime corrotte, inutilizzate e possibilmente nocive.
   * Prestazioni del PC di spinta
   * Aumenti la stabilita' del sistema
   * Eviti .exe errori.
+-----#13--------------------------Campagna contro gli spam idioti.---------+

 Abitudine.
 
Scusa, per curiosita`, come ha fatto ad
evitare bash?
 
Voglio dire, nei sistemi che ho, praticamente
quasi sempre bash e` tra i piedi, direttamente
o come link da /bin/sh o simili.
 
Casi particolari, come csh o tsh o ksh si sono
praticamente estinti...
 
L'unico rimasto e` proprio dash, e neanche in
tutti i sistemi.
 
bye,
 
-- 
 
piergiorgio

 tutti i sistemi.
Appunto, e ce l'ho trovato io!  ;)
 
 
-- 
+---------------------------------------------------------------------------+
|    ero li assorto nei miei pensieri e uno mi ha chiesto l'ora... ho       |
|    dovuto sparargli una fucilata... stavo meditando... e che cazzo!       |
+-----#14--------------------Campagna contro le pubblicita` idiote.---------+

 echo "$C $T"
 
io la riscriverei in questo modo:
 
#!/bin/shu
C=0
while read line ; do
    set -- $line
         echo $1 $2
         N=$1
         G=$2
         # cose varie
         C=$(( C + N ))
         T=$(( T + 1 ))
done < pippo
echo "$C $T"
 
Dove pippo è il nome di un file.
IMO non è possibile leggere riga per riga da una variabile  ma devi 
necessariamente passare da un file.
 
Ciao
Giovanni
-- 
   A computer is like an air conditioner,
   it stops working when you open Windows.
   < 
http://giovanni.homelinux.net/
 >

 necessariamente passare da un file.
 
None. Sbagli.
Leggi tutto!
 
-- 
+---------------------------------------------------------------------------+
|   togliere virus lo trovo degradante, faccio il tecnico informatico e     |
|   non il servizio spurgo.                                                 |
+-----#16--------------------Campagna contro le pubblicita` idiote.---------+


 
Effettivamente ricordavo male!  Anche io in parecchi scripts dovevo 
processare informazioni costruite dinamicamente ma ho dovuto passare 
attraverso un file temporaneo, probabilmente per lo stesso motivo (sono 
passati parecchi anni ed adesso non ricordo esattamente) per il quale il 
tuo script non funziona.
 
Per evitare accessi al disco alloco un file temporaneo (con mktemp(1)) 
in /dev/shm cioè in RAM.


 le variabili funzionano, ma non so come esportarle fuori dal ciclo...
 
Mi rispondo:   Ma perché uscire dalla subshell?
 
Se metto il "while" ed il print finale (e quant'altro potrebbe servirmi) tra
parentesi tonde, il tutto viene trattato come un singolo oggetto, per cui,
tutto ció che é tra le parentesi RIMANE nella subshell del pipe!!!!
 
 
#!/bin/sh
 
P=$(cat $( ... ) | grep " ... " | awk .... | sed .... | sort |\
uniq -c | sort -h)
 
echo "$P" | ( while read N G
do
        # cose varie
        C=$(( $C + $N ))
        T=$(( $T + 1 ))
done
echo
echo "$C $T" )
 
 
... e non ha importanza se le istruzioni sono su piú righe!!!
E non scomodo bash!
 
Cosa abbiamo imparato?
1 Passare una variabile di piú righe con piú elementi per riga ad un ciclo
  while (anziché passare per un file).
2 Leggere piú variabili con una singola "read".
3 Mantenere un gruppo di istruzioni in una singola subshell.
 
 
-- 
+---------------------------------------------------------------------------+
| Avevo un lavoro, un posto fisso che mi rendeva bene e ci mantenevo tutta  |
| la famiglia. Poi un giorno e' arrivato un tale, che mi ha detto:          |
| Lazzaro, alzati e cammina! Da quel momento ho perso il posto, il lavoro e |
| sono finito in miseria.                                                   |
+-----#30-----------------Campagna contro i miracoli non richiesti.---------+

 in /dev/shm cioè in RAM.
 
Si, certo. Appoggiare files temporanei come dici tu, in ram é validissimo.
Qualche volta l'ho fatto anch'io.
Ma, é solo una mia abitudine, uso files solo quando mi serve effettivamente,
Per tutte le cose temporanee, fino a quando é possibile, preferisco passare
tra variabili, array.
Ciao.
 
-- 
+---------------------------------------------------------------------------+
|    --- MARSmail Export v1.21/4D                                           |
|    * Origin: Mia moglie e' magra! Falla mangiare! (2:332/405.12)          |
+-----#31--------------------Campagna recupero Fossil..............---------+