[Lugge] Re: Ciclo while con scopo locale

  • From: "Roberto A. F." <me@xxxxxxxxxxxxxxxxxxxxxx>
  • To: lugge@xxxxxxxxxxxxx
  • Date: Wed, 17 Mar 2004 07:48:36 +0100

On Tue, 16 Mar 2004 12:15:01 +0100
asettico <asettico@xxxxxxxxxxxxxxx> wrote:

> Ciao a tutti.
> 
> Ho recentemente scoperto che, in bash, un ciclo alimentato da una pipe
> viene eseguito in un sottoprocesso. Dico "scoperto" perché la mia
> esperienza deriva da Unix System V.
> Questo comportamento ha come conseguenza che il valore delle variabili
> 
> modificate all' _interno_ del ciclo non viene propagato all'
> _esterno_. Riporto lo snippet per riferimento:
> 

 Prova un po' questo:

> #!/bin/bash
> 
> num=0
> endtot=0
> lentot=0
> 
> # script.awk restituisce numero di riga di inizio e fine
> # di ogni blocco dati in $1
> # In poche parole, l'ambaradan riorganizza i blocchi di dati in $1,
> # riconoscendo quando più blocchi sono consecutivi e quindi non
> # necessitano di essere trattati singolarmente.
> script.awk $1 | sort -ns | while read line; do
>      let ++num
>      start=$(echo "$line" | cut -f 3)
>      end=$(echo "$line" | cut -f 4)
>      len=$(echo "$line" | cut -f 5)
>      if [ $start -eq $(($endtot + 1)) ]; then
>          endtot=$end
>          let 'lentot += len'
>      else
>          head -n $endtot $1 | tail -n $lentot >> $2
>          endtot=$end
>          lentot=$len
>      fi
>      echo -e "$endtot\t$lentot" > tmp.$$

export endtot
export lentot

> done
> # A questo punto, $endtot e $lentot valgono sempre 0!
> # Per ora, me la sono cavata così.
> # MA E' UNA SOLUZIONE VERAMENTE TROPPO BECERA, direi proprio un
> # TAPULLO!!!
> endtot=$(cat tmp.$$ | cut -f 1)
> lentot=$(cat tmp.$$ | cut -f 2)
> rm -f tmp.$$
> head -n $endtot $1 | tail -n $lentot >> $2
> 
> Qualcuno mi sa suggerire un'alternativa un po' più elegante del
> tapullo qui utilizzato?

 Se non funziona prova inizializzare endtot/lentot dentro allo while con
un cosa del genere

 if [ $num == 0 ]; then
        endtot=0;
        lentot=0;
 fi


 Ciao,
-- 
   ,__    ,_     ,___   .-------=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-.
   ||_)   ||\    ||_   /        Oh Capitano, Oh mio Capitano       |
   || \   ||¯\   ||¯     linuxgrp: http://www.lugge.net            |
   ¯¯  ¯° ¯¯  ¯° ¯¯  °   homepage: http://roberto.foglietta.name   |
\  Roberto A. Foglietta  reg num : #219348 by the Linux Counter    |
 `---------------------=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-'
========----------

 Prima di scrivere in m-list per favore leggi il regolamento
 http://www.lugge.net/soci/index.php?link=manifesto

 Archivio delle e-mail postate in lista
 http://www.freelists.org/archives/lugge/

 Modifica dell'account sulla lista LUGGe
 http://www.lugge.net/soci/index.php?link=manifesto.htm#list


Other related posts: