Discussione:
/bin/sh (non bash) ciclo while e variabili locali/globali
(troppo vecchio per rispondere)
BIG Umberto
2017-07-23 10:54:56 UTC
Permalink
Raw Message
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.---------+
Piergiorgio Sartor
2017-07-23 11:11:07 UTC
Permalink
Raw Message
Post by BIG Umberto
#!/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
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...
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
BIG Umberto
2017-07-23 12:19:54 UTC
Permalink
Raw Message
Piergiorgio Sartor in data 13:11, domenica 23 luglio 2017, nel gruppo
Post by Piergiorgio Sartor
Per prima cosa, da me /bin/sh e` un link a /bin/bash,
quindi le due coso sono la stessa.
Giusta osservazione, da me invece é un link a /bin/dash
Post by Piergiorgio Sartor
Secondo, non credo sia possibile "esportare" da un
processo figlio ad uno padre, ma solo il contrario.
Infatti temevo proprio questo.
Speravo ad uno "escamotage" ortodosso...
Purché non si debba passare per un file.
Post by Piergiorgio Sartor
D'altro canto, se il problema e` *solo* stampare il
#!/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".
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.---------+
Piergiorgio Sartor
2017-07-23 12:41:29 UTC
Permalink
Raw Message
On 2017-07-23 14:19, BIG Umberto wrote:
[...]
Post by BIG Umberto
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
Hai considerato male.
Come sarebbe "pesante"?
Hai fatto benchmark significativi?

Lascia perdere ed usa "bash", va benissimo.

bye,
--
piergiorgio
BIG Umberto
2017-07-23 13:17:45 UTC
Permalink
Raw Message
Piergiorgio Sartor in data 14:41, domenica 23 luglio 2017, nel gruppo
Post by Piergiorgio Sartor
[...]
Post by BIG Umberto
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
Hai considerato male.
Come sarebbe "pesante"?
Hai fatto benchmark significativi?
Lascia perdere ed usa "bash", va benissimo.
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.---------+
Piergiorgio Sartor
2017-07-23 13:30:41 UTC
Permalink
Raw Message
On 2017-07-23 15:17, BIG Umberto wrote:
[...]
Post by BIG Umberto
Pesante, nel senso che é grande oltre 800k, mentre sh (dash) solo poco piú di
150k.
Si dice che "early optimization is the root
of all evil", detto altrimenti "non bisogna
fasciarsi la testa prima di averla rotta".

Se 800K sono un problema, allora ti conviene
scriverti il programma in C.
Senza dubbio ti viene piu` veloce e piu` piccolo
dell'equivalente che usa bash o dash.
Post by BIG Umberto
Non avendo necessitá, in uno script di tanti fronzoli, non ho mai usato bash.
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
BIG Umberto
2017-07-23 14:14:53 UTC
Permalink
Raw Message
Piergiorgio Sartor in data 15:30, domenica 23 luglio 2017, nel gruppo
Post by Piergiorgio Sartor
[...]
Post by BIG Umberto
Pesante, nel senso che é grande oltre 800k, mentre sh (dash) solo poco piú
di 150k.
Si dice che "early optimization is the root
of all evil", detto altrimenti "non bisogna
fasciarsi la testa prima di averla rotta".
Certo, ma prevenire dicono possa essere meglio!
Post by Piergiorgio Sartor
Se 800K sono un problema, allora ti conviene
scriverti il programma in C.
Senza dubbio ti viene piu` veloce e piu` piccolo
dell'equivalente che usa bash o dash.
Vedi sotto.
Ci gira un server web, un server ssh su piú porte, una caterva di script in
cron...
Prima girava su un raspberry con 512 mega, ed era meglio risparmiare ram, ora
su un rpi3 da 1 giga.
Post by Piergiorgio Sartor
Post by BIG Umberto
Non avendo necessitá, in uno script di tanti fronzoli, non ho mai usato
bash. Abitudine.
Scusa, per curiosita`, come ha fatto ad
evitare bash?
Raspberry pi con jessie.
Non l'ho messo io, l'ho trovato cosí.
[cfr. Chi ha incastrato Roger Rabbit]
Post by Piergiorgio Sartor
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.
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.---------+
Giovanni
2017-07-23 15:48:50 UTC
Permalink
Raw Message
Post by BIG Umberto
#!/bin/sh
echo "$P" | while read N G
do
# cose varie
C=$(( $C + $N ))
T=$(( $T + 1 ))
done
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/ >
BIG Umberto
2017-07-23 15:54:31 UTC
Permalink
Raw Message
Giovanni in data 17:48, domenica 23 luglio 2017, nel gruppo
Post by Giovanni
Dove pippo è il nome di un file.
IMO non è possibile leggere riga per riga da una variabile ma devi
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.---------+
Giovanni
2017-07-24 14:52:57 UTC
Permalink
Raw Message
Post by BIG Umberto
Giovanni in data 17:48, domenica 23 luglio 2017, nel gruppo
Post by Giovanni
Dove pippo è il nome di un file.
IMO non è possibile leggere riga per riga da una variabile ma devi
necessariamente passare da un file.
None. Sbagli.
Leggi tutto!
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.

Ciao
Giovanni
--
A computer is like an air conditioner,
it stops working when you open Windows.
< http://giovanni.homelinux.net/ >
BIG Umberto
2017-07-25 08:10:07 UTC
Permalink
Raw Message
Giovanni in data 16:52, lunedì 24 luglio 2017, nel gruppo
Post by Giovanni
Per evitare accessi al disco alloco un file temporaneo (con mktemp(1))
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..............---------+
BIG Umberto
2017-07-25 07:12:20 UTC
Permalink
Raw Message
BIG Umberto in data 12:54, domenica 23 luglio 2017, nel gruppo
Post by BIG Umberto
#!/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
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...
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.---------+
Loading...