|
Ver temas sin respuesta | Ver temas activos
Foros Linux » Desarrollo » Programación
Página 1 de 1
|
[ 8 mensajes ] |
|
| Autor |
Mensaje |
leonbarcelo

Forista Nuevo
Registrado: Vie Nov 18, 2011 10:55 am Mensajes: 2
|
 Publicado: Vie Nov 18, 2011 11:28 am |
|
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. 
|
|
|
|
 |
neurus

Forista Distinguido
Registrado: Sab Oct 09, 2004 11:00 pm Mensajes: 1299
|
 Publicado: Vie Nov 18, 2011 4:08 pm |
|
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
|
|
|
|
 |
ramonovski

Forista Medio
Registrado: Dom Sep 05, 2010 8:30 pm Mensajes: 398
|
 Publicado: Vie Nov 18, 2011 4:12 pm |
|
|
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
|
|
|
|
 |
neurus

Forista Distinguido
Registrado: Sab Oct 09, 2004 11:00 pm Mensajes: 1299
|
 Publicado: Vie Nov 18, 2011 4:18 pm |
|
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.
|
|
|
|
 |
leonbarcelo

Forista Nuevo
Registrado: Vie Nov 18, 2011 10:55 am Mensajes: 2
|
 Publicado: Sab Nov 19, 2011 10:05 am |
|
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.
|
|
|
|
 |
niky45

Forista Ancestral
Registrado: Mié Abr 11, 2007 11:00 pm Mensajes: 8550 Ubicación: tras la pantalla (...)
|
 Publicado: Sab Nov 19, 2011 11:45 am |
|
|
|
 |
neurus

Forista Distinguido
Registrado: Sab Oct 09, 2004 11:00 pm Mensajes: 1299
|
 Publicado: Sab Nov 19, 2011 12:13 pm |
|
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.).
|
|
|
|
 |
akodo

Moderador
Registrado: Mié Nov 28, 2007 12:00 am Mensajes: 1361 Ubicación: En la X del explorer (pulse para llamar)
|
 Publicado: Sab Nov 19, 2011 4:11 pm |
|
|
[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)
|
|
|
|
 |
|
|
|
Página 1 de 1
|
[ 8 mensajes ] |
|
¿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
|
|