[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: shell scripting



On Wed, Nov 27, 2002 at 11:21:35AM -0300, German Gutierrez wrote:
> * Cuenta la leyenda que Emilio J. Padrón (emilioj@mail2.udc.es) escribió:
> > On Wed, Nov 27, 2002 at 12:53:57PM +0100, Victor Calzado Mayo wrote:
> > > -----BEGIN PGP SIGNED MESSAGE-----
> > > Hash: SHA1
> > > 
> > > Hola
> > > On Wednesday 27 November 2002 12:14, Emilio J. Padrón wrote:
> > > > Hola lista,
> > > >
> > > > ¿cómo puede hacer para que una variable de entorno que hereda una
> > > > subshell se pueda modificar en esa subshell y el valor modificado quede
> > > > actualizado en la shell padre?
> > > 
> > > Si se trata de pasar cosas entre una subshell y su shell madre no puedes 
> > > utilizar variables de entorno, aunque no te lo podría jurar, si necesitas que 
> > > un script herede las variables modificadas por otro puedes evitar usar el 
> > > fork de la subshell ejecuntando el script2 con .
> > > 
> > > ....
> > > 
> > 
> > 
> > Gracias a todos por las respuestas. 
> > 
> > El problema básico me lo estoy encontrando al enlazar dos comandos con
> > una tubería dentro de un scripts:
> > 
> > grep -h "${ETIQUETA}" ${1:-*} | while read KK0 KK1 T
> > 
> > en el while lo que hago es buscar los valores máximo y mínimo en una
> > lista de valores (resultado del grep). El caso es que no consigo que una
> > vez ejecutado el while los valores de las variables MAX y MIN
> > permanezcan (los comandos enlazados por una tubería se ejecutan cada
> > uno en una subshell, según tengo entendido). Es decir, algo como:
> > 
> > ----------------
> > export MAX=0
> > 
> > grep -h "${ETIQUETA}" ${1:-*} | while read KK0 KK1 T
> > do
> > 
> > if [ $MAX ]
> > then
> >         if [ `echo "$T<$MAX" | bc` = 1 ]
> >         then
> >         continue
> >         fi
> > fi
> > MAX=$T
> > done
> > 
> > echo $MAX
> > ----------- 
> > y que funcione, claro :-)
> > 
> > como me habéis dado varios consejos interesantes a ver si busco una
> > solución/alternativa.
> > 
> 
> Alternativa awk:
> 
> grep -h "${ETIQUETA}" ${1:-*} | awk '
> BEGIN{ max="nada" }
> { if ( (max == "nada") || ( max < $3 ) ) max = $3; }
> END{print max}'
> 
> pudiendo hacer:
> 
> maximo=`grep -h "${ETIQUETA}" ${1:-*} | awk 'BEGIN{ max="nada" }{ if ( (max == "nada") || ( max < $3 ) ) max = $3; }END{print max}'` 
> echo el mas grandote es: $maximo
> 
> 
> Espero te sirva...
> 


¡Gracias pedazo CRACK!
Me ha venido de perlas tu solución, con lo que ya me ahorro los
problemas que estaba teniendo con lo de pasar valores entre shells.
Finalmente me ha quedado así (a lo mejor es un poco chapuza, pero no
suelo escribir muchos scripts y nunca había usado awk):

-------------------------------------------
#/bin/sh

ETIQUETA="TOTAL TIME"

grep -h "${ETIQUETA}" ${1:-*} | awk '
BEGIN{ MAX="nada"; MIN="nada"; CONT=0; MEDIA=0; }
{ if ( (MAX == "nada") || ( MAX < $3 ) ) MAX = $3; }
{ if ( (MIN == "nada") || ( MIN > $3 ) ) MIN = $3; }
{ CONT ++; }
{ MEDIA += $3 }
END{ print "min = "MIN; print "max = "MAX; print "media = "MEDIA /
CONT; }'
-------------------------------------------

y.... ¡Funciona!

Una cosilla, eso sí, cuando alguna de las líneas que el grep le pasa
al awk no tiene la columna que necesito (la 3 en este caso), el cálculo
del mínimo no funciona bien (son números reales, y supongo que awk
debe de considerar por ejemplo: 0.89234 > null). A ver cómo lo
soluciono, pero no me es vital.


Muchíiiiisimas gracias por el cable.

Saludos.



Reply to: