[Lugge] Ciclo while con scopo locale

  • From: asettico <asettico@xxxxxxxxxxxxxxx>
  • To: LUGGe <lugge@xxxxxxxxxxxxx>
  • Date: Tue, 16 Mar 2004 12:15:01 +0100

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:


#!/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.$$
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?
--
asettico (aka Roberto) [http://www.rossomaltese.it/]
GPG fingerprint [ BA20 8C8D 7712 9D9A 57F3 A96A A7BE 905C 1CB9 26BA ]


-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GCS/IT/O d++(-) s:+>: a34 C++$ ULAVH*++$>++++ P+ L+>++++ E--- W++(-) N(++)
o? K-? w(---) !O M@ V@ PS+@ PE- Y? PGP->++ t+++ 5? X++ R tv+ b+ DI(+)
D++(---) G(-)>-- e>++++ h---() r++ y+++*
------END GEEK CODE BLOCK------
========---------- 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 //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: