Reglamento general de los foros   •   FAQ   •   Buscar en el foro •  Registrarse | Iniciar sesión 



Foros Linux » Desarrollo » Programación


Nuevo tema Responder al tema
 [ 8 mensajes ] 
Patrocinadores

Autor
Buscar:
Mensaje

Desconectado
Forista Nuevo
Forista Nuevo

Registrado: Vie Nov 18, 2011 10:55 am
Mensajes: 2

Nota Publicado: Vie Nov 18, 2011 11:28 am 
Arriba  
Hola, Ante todo gracia por vuestra ayuda; Bueno, hola a todos y quería decir que me estoy metiendo el el mundillo de GNU/Linux y estoy aprendiendo a hacer Script con
la BASH.

Haber si pudierais ayudarme, lo que quiero es que cuando me salga la lista de los archivos encontrados, pues el usuario, escriba el archivo
de forma absoluta, pero lo que quiero en realidad es que me escriba alguna de las lineas, para que visualice el archivo deseado. Un ejemplo es con passwd

/etc/passwd
/etc/pam.d/passwd
/usr/bin/passwd
/usr/share/lintian/overrides/passwd
/usr/share/doc/passwd


Pues lo que quiero es que el usuario me escriba /etc/passwd osea el direccionamiento entero, si no lo escribe entero pues que de error de vuelve a darme el nombre del archivo de forma absoluta.

Gracias por la ayuda, y espero que podáis ayudarme.


#! /bin/bash
#Escribe un script que pida por teclado el nombre de un fichero de texto y que a
#continuación muestre el contenido de ese fichero.

declare -i a=0;
declare -i b=1;

read -p "Dame el nombre del fichero de texto que deseas visualizar: " nombre;

#Compruebo que lo que me de el usuario es algo y no este vacío
while [ -z "$nombre" ]
do
echo "Por favor, escribe algo";
read -p "Dame el nombre del fichero de texto que deseas visualizar: " nombre;
done

echo "Su petición se esta procesando, porfavor espere...";

find / -name $nombre -type f>busqueda.txt;

#Cuento las lineas que vuelco en el archivo, para que despues, dependiendo del numero
#de lineas encontradas hago algo.
numero=$(cat busqueda.txt|wc -l);

#Aqui lo que hago es que mientras $numero sea igual a cero, pues.
while [ $numero -eq $a ]
do
read -p "El nombre del fichero no existe en el sistema; Deme otro nombre : " nombre;
#aqui hago que repita la busqueda.
find / -name $nombre -type f>busqueda.txt;
#que cuente las lineas del archivo.
numero=$(cat busqueda.txt|wc -l);
echo "Su petición se esta procesando, porfavor espere...";
done

#Aqui compruebo que si el numero de lineas encontradas por find es mayor que 1 haga todo
#lo que esta en el then; si es igual a 1 visualice el archivo directamente.

if [ $numero -gt $b ]; then

cat busqueda.txt;
echo "Gracias por esperar...";
echo "Dame el nombre de algunos de los archivos que se visualizan, de forma absoluta :";
echo "ya que" $nombre "esta repetido" $numero "veces";

read -p "El archivo es: " nombre2;

Yo pienso que la solucion vendria por aqui con la utilizacion de un while, y e usado el comando sed para que el usuario empezara escribiendo / , y si no lo
hacia daba error, pero nose, e pensado varias formas pero necesito ayuda de gente mas cualificada que yo.


cat $nombre2;

else
echo "Gracias por esperar..."
archivo=$(cat busqueda.txt|cut -f1);
cat $archivo;

fi

Editado -- Vie Nov 18, 2011 6:28 pm --

Perdonad por volver a escribir, pero es que no me he dado cuenta, mirando algunos temas, e visto que la gente responde diciendo que no se te puede ayudar escribiendote o arreglandote el script, Solo quiero decir que si pudierais ayudarme, diciendome algunos consejos o algun comando que deberia utilizar, osea algo de ayuda, aunque el script funciona perfectamente, pero como soy principiante me gustaria aprender mas sobre este tema. gracias por vuestra ayuda, y ya si alguien no le importa modificarme el script pues no me importa, miraria que solucion le a dado y asi aprender de ustedes: Gracias por vuestra comprension y ayuda. :)

 Perfil Email  

Desconectado
Forista Distinguido
Forista Distinguido
Avatar de Usuario

Registrado: Sab Oct 09, 2004 11:00 pm
Mensajes: 1299

Nota Publicado: Vie Nov 18, 2011 4:08 pm 
Arriba  
Por fin, alguien se da cuenta de que es irrespetuoso pedir que le hagan la tarea. Mis felicitaciones.
Sólo una aclaración: no es que no se puede escribir o modificar un script (hemos armado y regalado scripts increíblemente complejos en este foro). Sólo resulta ofensivo que alguien aparezca en el foro, pida que le hagan la tarea porque no tiene ganas de pensarla y se siente a esperar la solución, tan campante. Tenemos dos o tres de esos por semana.
Cuando muestran, en cambio, que al menos están intentando aprender, siempre reciben ayuda. Todos fuimos novatos.

En cuanto a tu problema, utilizar while podría ser una opción. Yo me decantaría por una función recursiva utilizando if.

Notas:
- Doy por sentado que el resto del script está bien. No lo revisé. Un consejo: utiliza las etiquetas code, e indenta un poco eso para mostrarlo en un foro, porque así como está es infumable.
- Para comprobar que un archivo existe, tienes el parámetro -e: if [ -e archivo ]... (-d para directorio, -r para saber si es legible, -w para saber si es escribible...).

La función:
Código:
existe (){
read -p archivo archivo
if [ -e $archivo ]; then echo "existe"; else existe; fi

}

existe


Es bastante clara, y funciona como un bucle while: mientras el archivo no exista, seguirá llamando a la propia función. Cuando existe, hace lo que corresponda. En este caso, echo "existe". Claro que, si no quieres que el resto del script se ejecute dentro de la función (tal vez por legibilidad), puedes reemplazar ese echo existe por una llamada a otra función, que haga lo que se supone que debes hacer.

En cuanto a la variable $archivo, en este caso la leo desde teclado, para hacer que la función sea independiente de tu script. En tu script, puedes reemplazar esa variable por la que contenga el archivo a comprobar.

Saludos.


Última edición por neurus el Vie Nov 18, 2011 4:13 pm, editado 1 vez en total
 Perfil  

Desconectado
Forista Medio
Forista Medio
Avatar de Usuario

Registrado: Dom Sep 05, 2010 8:30 pm
Mensajes: 398

Nota Publicado: Vie Nov 18, 2011 4:12 pm 
Arriba  
Ayúdame a entenderlo y podré darte una mano, que me he enredado un poco.

¿Lo que quieres hacer es que el usuario al introducir el nombre de un archivo (ej. nombre3.py) lo visualize, y en caso de no existir tal como lo escribió, entonces le muestre las coincidencias similares que existen con ruta incluida (ej. /arst/nombre3.py, /hjkl/nombre3.py, /fuwnoiraset/nombre3.py) y una vez desplegada esta lista de concidencias que elija una opción?

¿Y en caso de que el usuario sí dé el nombre del archivo y ruta incluida (ej. /arst/nombre3.py) se lo despliegue con el comando cat?

----

Sobre lo de no ayudarte escribiéndote o arreglándote el script cuando se pide ayuda es en parte cierto, aunque solo aplicable al típico post de:

"c me pide q buske ezzta cadna de carácteres, komo le ago?"

Muy diferente es cuando alguien viene a pedir ayuda con una idea de lo que quiere, un avance de lo que ha hecho y una buena ortografía.

Recomendación: cualquier linea de código que postees, hazlo entre las etiquetas "code".

Editado -- Vie Nov 18, 2011 2:11 pm --

Joder, no alcancé a leer el post de neurus...

_________________
scrotwm@FreeBSD
pekwm@Sabayon
::vim::zsh::urxvtd|blog::dotfiles::last.fm

 Perfil Email  

Desconectado
Forista Distinguido
Forista Distinguido
Avatar de Usuario

Registrado: Sab Oct 09, 2004 11:00 pm
Mensajes: 1299

Nota Publicado: Vie Nov 18, 2011 4:18 pm 
Arriba  
Je. Y yo no alcancé a leer el tuyo. Justo lo estaba editanto para pedir por favor, que la próxima vez utilizara las etiquetas code...

El siguiente post lo escribimos en coautoría, para no repetirnos.

Y ahora que leo la función que escribí, resulta algo confusa la utilización del término existe, básicamente porque está en todas partes. Siempre me pasa lo mismo. En mi último trabajo, utilizando mysql y php, llegué a un punto en que tuve que reescribir todas las variables, por salud mental.

En fin, donde dice:
Citar:
then echo "existe"; else existe;
, espero que se note que el primer "existe", es sólo texto que se muestra por pantalla. El segundo, es una llamada a la función, que también se llama existe.

 Perfil  

Desconectado
Forista Nuevo
Forista Nuevo

Registrado: Vie Nov 18, 2011 10:55 am
Mensajes: 2

Nota Publicado: Sab Nov 19, 2011 10:05 am 
Arriba  
Bueno, Gracias por contestar.
Como puse todo el Script de aquella manera; os pongo lo que creo que es donde se debería añadir o modificar la parte del script para que pueda realizar lo que yo deseo.

Para que podáis seguir el script , lo que hago es comparar el numero de lineas volcadas en un archivo, (si es que find a encontrado los archivos).

Código:
if [ $numero -gt $b ]; then           

                     cat búsqueda.txt;
                     echo "Gracias por esperar...";
                     echo "Dame el nombre de algunos de los archivos que se visualizan, de forma absoluta :";
                     echo "ya que" $nombre "esta repetido" $numero "veces";

                      read -p "El archivo es: " nombre2;
                       cat $nombre2;

else
                       
                       echo "Gracias por esperar..."
                       archivo=$(cat búsqueda.txt|cut -f1);
                       cat $archivo;

fi


Bueno os explico lo que quería hacer:
Compruebo que si el nº de lineas es mayor que 1(osea, que a encontrado mas de un archivo repetido), me visualice la lista, y pida por teclado el nombre del archivo de forma absoluta). Que no hay mas de 1 archivo, pues que me lo visualice directamente con cat.

Una vez que ya habéis comprendido el script aquí viene mi pregunta:
Código:
imaginad que sale una lista como la de passwd
     
       /etc/passwd
      /etc/pam.d/passwd
      /usr/bin/passwd
      /usr/share/lintian/overrides/passwd
      /usr/share/doc/passwd

¿Pues, de que forma podria hacer yo, que el usuario, me diera alguno de estos direccionamientos de forma absoluta, para que ya se visualizara dicha eleccion directamente con cat; y en el caso de que escribieran /etc , /etc/pass, lo k sea pero k no coincidiera con los direccionamientos visualizados, pues que me repitiera por ejemplo: Dame un nombre de los que se visualizan de forma absoluta. Gracias

Y neurus, gracias de antemano, e estado viendo la solución tuya, pero e visto, que si el usuario escribe el nombre por ejemplo passwd ya pasa y me visualiza passwd pero un archivo vacío. Haber si hay otra forma que usted supiera hacer.

y ramonovski, gracias tambien por contestar. Lo que dices, es correcto. As entendido mi problema. Que eliga el usuario una opcion de la lista, y si no la escribe igual pues siga insistiendo en dame un archivo de la lista. Quiero hacer esto, por si alguien llega y ejecuta el script, y le sale toda la lista con los archivos, y por cualquier razón me escribe /etc/passd y se olvida de la w, siga pidiendo el archivo, hasta que lo escriba correctamente.

Gracias a todos,los que ayudéis y intentéis ayudar.

 Perfil Email  

Desconectado
Forista Ancestral
Forista Ancestral
Avatar de Usuario

Registrado: Mié Abr 11, 2007 11:00 pm
Mensajes: 8550
Ubicación: tras la pantalla (...)

Nota Publicado: Sab Nov 19, 2011 11:45 am 
Arriba  
bueno. si te interesa aprender, te dejare un par de guias....
http://www.etxea.net/docu/taller_bash/bash.html ## muy basica, pero es buenisima.
http://tldp.org/LDP/abs/html/ ## bash avanzado....
http://linux.die.net/man/1/bash ## imprescindible echarle un ojo al man. es uno de los mejores que hay.

le echaria un vistazo a tu script, y tal... pero estoy demasiado dormida, en este momento. :| y ya tienes a dos expertos. :D

_________________
#446716

--Not me, guys. I read the Bash man page each day like a Jehovah's Witness reads the Bible. No wait, the Bash man page IS the bible. Excuse me...
(from comp.os.linux.misc)
[ DNFD ] - [ F4A ] - [ dotfiles ]

 Perfil Email WWW  

Desconectado
Forista Distinguido
Forista Distinguido
Avatar de Usuario

Registrado: Sab Oct 09, 2004 11:00 pm
Mensajes: 1299

Nota Publicado: Sab Nov 19, 2011 12:13 pm 
Arriba  
Citar:
Y neurus, gracias de antemano, e estado viendo la solución tuya, pero e visto, que si el usuario escribe el nombre por ejemplo passwd ya pasa y me visualiza passwd pero un archivo vacío. Haber si hay otra forma que usted supiera hacer.



No entiendo. En la función que pasé arriba, si el usuario escribe un nombre inexistente, vuelve a pedir el nombre del archivo. Es decir, vuelve a ejecutarse la función.

Si lo que quieres es que el usuario elija rutas absolutas de una lista, deberías usar case, y en lugar de escribir toda la ruta, el usuario sólo debería escribir el número de la opción (1, 2, 3, etc.).

 Perfil  

Desconectado
Moderador
Moderador
Avatar de Usuario

Registrado: Mié Nov 28, 2007 12:00 am
Mensajes: 1361
Ubicación: En la X del explorer (pulse para llamar)

Nota Publicado: Sab Nov 19, 2011 4:11 pm 
Arriba  
[quote=neurus]Si lo que quieres es que el usuario elija rutas absolutas de una lista, deberías usar case, y en lugar de escribir toda la ruta, el usuario sólo debería escribir el número de la opción (1, 2, 3, etc.).[/quote]
Yo también optaría por esta opción. De cara al usuario, le resulta más fácil escribir un número, y es menos propenso a errores.

En cuanto al "find" que utilizas, considera cambiarlo por "locate". Es bastante más rápido, aunque como contraprestación, tienes que tener la base de datos que utiliza actualizada (simplemente es ejecutar "updatedb" como root)

_________________
Descargue el gestor de mp3 "Music Manager" -> (mmlf)
Última versión del gestor "Music Manager" -> (jmmm)

 Perfil  
Mostrar mensajes previos:  Ordenar por  
 [ 8 mensajes ] 
Nuevo tema Responder al tema

Saltar a:  


¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 4 invitados

No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro
No puede enviar adjuntos en este Foro

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group :: Style based on FI Subice by phpBBservice.nl :: Todos los horarios son UTC - 6 horas
Traducción al español por Huan Manwë
phpBB SEO