Comunidad Underground Hispana  

Retroceder   Comunidad Underground Hispana > Programacion > Programación > Shell


Respuesta Crear Nuevo Tema
 
Compartir en twitter LinkBack Herramientas Desplegado
Antiguo 28-oct-2010, 06:21   #1
Recien llegado
 
Fecha de Ingreso: octubre-2010
Amigos 0
Mensajes: 3
Gracias: 1
Agradecido 0 veces en 0 mensajes.
Predeterminado echo sobre el anterior

Hola buenas,

Queria saber si es posible hacer que cada hecho se haga sobre el anterior. Es decir, que no se creen nuevas lineas.

Por ejemplo en un while que haga un echo del uno al cinco, en vez de salir esto:

1
2
3
4
5

o esto:

1 2 3 4 5

que salga
1, en la siguiente iteracion el 2 donde estaba el 1, en la siguiente el 3 en el mismo sitio.. hasta el 5. Espero haberme esplicado bien lo que quiero.

Muchas gracias, y un saludo!!
Thorrr está desconectado   Responder Citando
Antiguo 31-oct-2010, 10:03   #2
Miembro
 
Avatar de Princesita
 
Fecha de Ingreso: abril-2010
Amigos 3
Mensajes: 106
Gracias: 0
Agradecido 5 veces en 5 mensajes.
Predeterminado Respuesta: echo sobre el anterior

No entiendo 100% tu peticion, pero si son un rango de numero en incremento (O sea 1,2,3,4,5) por ejemplo, porke no le restas 1 numero a la variable incremento??? Ejemplo:

Código:
for A in 1 2 3 4 5 
do

  let C=($A-1);
  echo $C;

done;


exit $?;
  
Que produciria una salida tipo:

Código:
bash-4.1$ bash bashy.sh
0
1
2
3
4
  
Sino es eso, y es asignar el valor anterior a la nueva impresion por pantalla, tendras que solicitar haber si existe en BASH funciones tipo Unshift, Push, Pop, etc. (No tengo conocimientos si en Bash existen) pero sirven como asignacion de elementos a un arreglo ya existente.

-------------------------------------------------------------------


Última edición por Princesita; 01-nov-2010 a las 21:35
Princesita está desconectado   Responder Citando
Antiguo 31-oct-2010, 11:21   #3
Recien llegado
 
Fecha de Ingreso: octubre-2010
Amigos 0
Mensajes: 3
Gracias: 1
Agradecido 0 veces en 0 mensajes.
Predeterminado Respuesta: echo sobre el anterior

Gracias por la respuesta! De todos modos, creo que no me he esplicado bien.. lo de los numeros es solo un ejemplo.

Lo unico que quiero es que en cada hecho se borre lo anterior y se escriba sobre el anterior. Por ejemplo algo asi como lo que hace el comando: top

En vez de escribir nuevas lineas, actualiza las anteriores.
Thorrr está desconectado   Responder Citando
Antiguo 31-oct-2010, 12:03   #4
Miembro
 
Avatar de Princesita
 
Fecha de Ingreso: abril-2010
Amigos 3
Mensajes: 106
Gracias: 0
Agradecido 5 veces en 5 mensajes.
Predeterminado Respuesta: echo sobre el anterior

Ahhhhh, bueno lo hice en Perl en vez de Bash pero la traduccion no es nada complicada haber, quieres algo mas o menos asi:

Código:
my @arreglo = ( "pepe", "juan", "maria", "Jose", "Carlos" );


print STDOUT "******* EL Arreglo Normal es *********\n";
for ( my $numero = 0; $numero < @arreglo; $numero++ ) {

  print STDOUT $arreglo[$numero] . " Arreglo No. ::  " . $numero;
  print "\n";
};
print "\n*******************************************\n";



print STDOUT "************ El Arreglo Modificado es *********\n";
for ( my $numero = 0; $numero < @arreglo; $numero++ ) {

  if ( $arreglo[$numero] == $arreglo[$numero] ) {

    $arreglo[$numero] = $arreglo[$numero+1];

  };
    print $arreglo[$numero] . " Arreglo No. :: " . $numero;
    print "\n";
};
print "\n*****************************************************\n";
  
Que imprime en Pantalla algo mas o menos asi:

Código:
bash-4.1$ perl programa.pl

******* EL Arreglo Normal es *********
pepe Arreglo No. ::  0
juan Arreglo No. ::  1
maria Arreglo No. ::  2
Jose Arreglo No. ::  3
Carlos Arreglo No. ::  4


************ El Arreglo Modificado es *********
juan Arreglo No. :: 0
maria Arreglo No. :: 1
Jose Arreglo No. :: 2
Carlos Arreglo No. :: 3
 Arreglo No. :: 4

*****************************************************
  
Como sabes el Arreglo No. 4 como no tuvo sustituto anterior quedo 'nulo' (pasara sea al inicio del conteo o al final, al menos que tu sustituyas con una variable dicho valor al iniciar o finalizar el conteo en el bucle sea cual sea el caso).



Última edición por Princesita; 01-nov-2010 a las 21:35
Princesita está desconectado   Responder Citando
El Siguiente Usuario Agradeció a Princesita Por Este Mensaje:
Thorrr (31-oct-2010)
Antiguo 31-oct-2010, 12:24   #5
Recien llegado
 
Fecha de Ingreso: octubre-2010
Amigos 0
Mensajes: 3
Gracias: 1
Agradecido 0 veces en 0 mensajes.
Predeterminado Respuesta: echo sobre el anterior

Te agradezco mucho la respuesta, pero creo que seguimos sin entendernos.. jejeje. En realidad no se lo que has entendido, pero se agradece de verdad.

A ver si con otro ejemplo (este ejemplo puede que sea mas claro). Imagínate que quiero programar un reloj en Shell. Pues me gustaría que el resultado fuese un solo print que se va actualizando, como cualquier reloj digital. Con lo que se ahora, solo podría ponerlo de la siguiente forma:

12:04
12:05
12:06
12:07

Pero no quiero eso. Quiero que solo aparezca 12:04 y dentro de un segundo, el cuatro se convierta en un cinco, despues en un seis, un siete..

Creo que ahora me he esplicado mejor.. esque no es facil decirlo..
Thorrr está desconectado   Responder Citando
Antiguo 31-oct-2010, 12:37   #6
Miembro
 
Avatar de Princesita
 
Fecha de Ingreso: abril-2010
Amigos 3
Mensajes: 106
Gracias: 0
Agradecido 5 veces en 5 mensajes.
Predeterminado Respuesta: echo sobre el anterior

Ahora me explico, lo que hice fue, crear 1 variable arreglo con varios elementos (ya que no se si estas tu trabajando sobre una variable o sobre un archivo de texto o btw) mi arreglo es :

my @arreglo = ( "pepe", "juan", "maria", "Jose", "Carlos" );

Bien, creo 1 bucle For que recorre inicialmente el arreglo anterior para imprimir sus indices:

INDICE ELEMENTO
0 pepe
1 juan
2 maria
3 Jose
4 Carlos

Hasta ahi vamos bien, y ese for inicial esta demas (ya que tu sabes que el arreglo tiene esos valores) pero me servia para ejemplificar el cambio. Ahora, tu quieres que los valores de los indices sean sustituidos por el anterior o sea :

INDICE ELEMENTO
0 juan
1 maria

etc etc etc

So, hice un segundo bucle FOR donde esta vez comparo el arreglo con si mismo:

if ( $arreglo[$numero] == $arreglo[$numero] ) {

$arreglo[$numero] = $arreglo[$numero+1];

};


Por lo que sabemos que el indice == indice obviamente jeje, entonces como esto se cumple, cada vez que el programa vea:

if ( pepe == pepe ) {
arreglo = (indice --> 0 (que le pertenecia a pepe)) = (indice --> 1 (que le pertenece a Juan))

Por lo que el valor que existia en Indice 0 que era 'pepe' ahora pasara a ser de 'Juan' que es el elemento que le seguia, y 'Juan' ocupaba el indice 1 pero ahora lo ocupa el elemento del indice 2.

En resumen, cuando compares el arreglo con si mismo, para poner el proximo valor en ese valor comparado, basta con incrementarle al contador 1 indice mas

if ( arreglo[$contador] == arreglo[$contador]) :
arreglo[$contador] = arreglo[$contador++]

Se puede mejorar obviamente =) pero mi logica nunca ha sido muy buena jeje, pero se apana mas o menos para lo que buscas. Solo debes hacer la traduccion para BASH

PD: Aplicaria tambien para tu ejemplo del reloj. Si aun no es lo que solicitas, podrias indicar precisamente en base a que estas trabajando para buscar lo que quieres hacer???? O sea estas trabajando sobre un archivo con par de datos y quieres actualizar esos datos o sobre alguna otra cosa?

En tu ejemplo del reloj si mi variable fuese:

$arreglo = ( "01", "02", "03" );

en el bucle FOR cada vez que :

if ( 01 == 01 ):
$arreglo = $arreglo[contador+1) * Donde contador+1 salta al proximo indice en este caso "02""

Tonces cuando imprimas el valor del indice 0 que era 01 antes, ahora el indice 0 estara ocupado por '02'



Última edición por Princesita; 01-nov-2010 a las 21:36
Princesita está desconectado   Responder Citando
Antiguo 31-oct-2010, 13:10   #7
Miembro
 
Avatar de Princesita
 
Fecha de Ingreso: abril-2010
Amigos 3
Mensajes: 106
Gracias: 0
Agradecido 5 veces en 5 mensajes.
Predeterminado Respuesta: echo sobre el anterior

Creo que ya estoy entendiendo que es lo que estas intentando hacer...

Espero que no me estes haciendo referencia a programacion en tiempo real.....

Porfavor podrias ejecutar lo siguiente en tu Terminal Bash:

Código:
#!/bin/bash

clear

for A in 1 2 3 4 5
do

  echo $A
  sleep 02
  clear

done;

exit $?;
  
Es mas o menos eso lo que estas buscando ver? que la pantalla quede totalmente limpia para imprimir el nuevo valor que tu vez como 'actualizable del anterior' porque si me haces referencia a programacion en tiempo real y no lo anterior, ahi la cosilla se diferencia mucho y tendriamos que echar a un ladito el interprete bash y involucrarnos en un lenguaje de programacion mas adaptado al tiempo real.
Princesita está desconectado   Responder Citando
Respuesta

Etiquetas
echo

Herramientas
Desplegado

Normas de Publicación
No puedes crear nuevos temas
No puedes responder mensajes
No puedes subir archivos adjuntos
No puedes editar tus mensajes

Los Códigos BB están Activado
Las Caritas están Activado
[IMG] está Activado
El Código HTML está Desactivado
Trackbacks están Activado
Pingbacks están Activado
Refbacks están Activado



Temas Similares
Tema Autor Foro Respuestas Último mensaje
[F][bat-vbs]Codigo vrs-creator manuberh Batch 3 23-may-2011 13:41
base de datos wago86 Batch 4 16-oct-2010 05:00
[F][bat] Acertijo del Lobo, la oveja y la paja kj Batch 5 11-oct-2010 00:24
[bat][f]Folder Pack manuberh Batch 4 29-ago-2010 05:16
[F][bat]W32Buster v2.9 Glaas2 Batch 6 30-jun-2010 21:12



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2013, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.0