[RISOLTO]Bash Script: Resettamento Variabile o.O

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
m@
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 476
Iscrizione: sabato 19 agosto 2006, 15:59
Località: Viareggio
Contatti:

[RISOLTO]Bash Script: Resettamento Variabile o.O

Messaggio da m@ »

ragazzi e' da ieri che sto combattendo contro uno script scritto in bash.
praticamente faccio un parsing di un file di log, con un cat reindirizzato su un while, ed ad ogni ciclo incremento una opportuna variabile
insomma morale della favola.. se faccio un echo della variabile all'interno del while, la vedo incrementare normalmente, ma se lo rifaccio subito dopo, questa mi torna al valore "di fabbrica" cioe' a zero
Vi prego datemi una mano, perche non mi riesce cavarci le gambe!
ecco il codice

Codice: Seleziona tutto

mails ()
{
        local mess row

        mess=0
        cat "$LOG_MAILS" | \
        while read row; do
                set -- $row
                [ $1 = "fetchmail:" ] && continue
                mess=$(( $mess + $1 ))
                echo $mess
        done
        echo $mess
        echo_screen 0 "mails_i" "$mess" 
}
ed un possibile file di log

Codice: Seleziona tutto

1
2
fetchmail:
3
fetchmail:
grazie in anticipo
M@
Ultima modifica di m@ il domenica 16 marzo 2008, 14:05, modificato 1 volta in totale.
Avatar utente
Re.in.stallo
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 646
Iscrizione: martedì 20 dicembre 2005, 23:50

Re: Bash Script: Resettamento Variabile o.O

Messaggio da Re.in.stallo »

m@ ha scritto: se faccio un echo della variabile all'interno del while, la vedo incrementare normalmente, ma se lo rifaccio subito dopo, questa mi torna al valore "di fabbrica" cioe' a zero
E' un "problema" di scope della variabile: stai usando una pipe (|) che, se non ricordo male, viene gestita aprendo una subshell indipendente (le cui variabili sono di default nascoste al processo che ha lanciato la subshell).

Saluti, ;)
Gabriele
Sto diventando un allitterato, non riecso più a scrviere senza errori con la tatsiera...
Avatar utente
m@
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 476
Iscrizione: sabato 19 agosto 2006, 15:59
Località: Viareggio
Contatti:

Re: Bash Script: Resettamento Variabile o.O

Messaggio da m@ »

cavolo, non ci sarei mai arrivato.. e quindi quale e' la maniera migliore per gestire sta cosa? volendo posso fare le stesse operazioni con altri comandi, ma ora sono curiso di gestire sta cosa :D
M@
Avatar utente
m@
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 476
Iscrizione: sabato 19 agosto 2006, 15:59
Località: Viareggio
Contatti:

Re: Bash Script: Resettamento Variabile o.O

Messaggio da m@ »

mi rispondo da solo :D

Codice: Seleziona tutto

mails ()
{
        local mess row

        mess=0
        while read row; do
                set -- $row
                [ $1 = "fetchmail:" ] && continue
                mess=$(( $mess + $1 ))
        done < <(cat "$LOG_MAILS")
        echo_screen 0 "mails_i" "$mess"
}
grazie mille Re.in.stallo per le info sulle subshells!!!
M@
Avatar utente
Re.in.stallo
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 646
Iscrizione: martedì 20 dicembre 2005, 23:50

Re: Bash Script: Resettamento Variabile o.O

Messaggio da Re.in.stallo »

m@ ha scritto: cavolo, non ci sarei mai arrivato.. e quindi quale e' la maniera migliore per gestire sta cosa? volendo posso fare le stesse operazioni con altri comandi, ma ora sono curiso di gestire sta cosa :D
Per quanto riguarda specificamente le subshells, purtroppo non conosco un modo "pulito" di allargare lo scope delle loro variabili, anzi, temo proprio che non ci sia; cito da qui:
A script may not export variables back to its parent process, the shell, or to the environment. Just as we learned in biology, a child process can inherit from a parent, but not vice versa.
Ovviamente esistono dei modi "poco puliti" per ottenere lo stesso risultato (ad esempio, salvare il valore delle variabili in un file temporaneo). Oppure, più semplicemente, si può riscrivere il codice evitando di chiamare delle subshells qualora si debba accedere a delle variabili locali.
m@ ha scritto: grazie mille Re.in.stallo per le info sulle subshells!!!
Prego!

Saluti, ;)
Gabriele
Sto diventando un allitterato, non riecso più a scrviere senza errori con la tatsiera...
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 3 ospiti