Duda bash script (SOLUCIONADO)

Temas sobre programación ( php, c, sql, html, perl, python, ruby, java, bash, etc ) y recursos ( herramientas, frameworks, hosting, cms, etc )

Moderadores: akodo, maiku

Responder
Bodegas
Forista Nuevo
Forista Nuevo
Mensajes: 4
Registrado: Lun Mar 28, 2011 10:32 am

Duda bash script (SOLUCIONADO)

Mensaje por Bodegas » Lun Mar 28, 2011 10:35 am

Estoy intentando hacer algo muy simple pero como siempre me estoy liando mucho :D

Lo que quiero hacer es meter en una variable la lista de ficheros pdf de un directorio para después pasar esa lista de ficheros como parámetros a un programa.

Lo que hice fue:

unset todo;
for i in `ls *.pdf`;
do
todo=$todo" "\"$i\";
done

programa $todo;

Lo que hago es ir concatenando todos los nombres de ficheros e insertar comillas dobles al principio y al final de cada nombre. Esto lo hago por si hay algún fichero que tenga espacios en blanco o paréntesis en el nombre.

El resultado es que no funciona. La cadena se crea bien. Si se hace un echo $todo aparecen todos los nombre correctamente entrecomillados y separados por un espacio pero al pasárselo al programa, no los reconoce como nombre de ficheros.
Da la impresión de que el programa interpreta las " como si fuesen parte del nombre...

Alguna idea?
Última edición por Bodegas el Vie Abr 01, 2011 9:11 am, editado 1 vez en total.
Avatar de Usuario
dracel
Forista Mayor
Forista Mayor
Mensajes: 634
Registrado: Sab Jun 07, 2008 7:00 am
Ubicación: España/Galicia/Pontevedra/Baiona/Sabaris

Re: Duda bash script

Mensaje por dracel » Lun Mar 28, 2011 2:42 pm

No se por que necesitas concatenar yo haría simplemente:
programa $todo *.pdf

*.pdf se debería expandir por todos los archivos acabados por .pdf, así que no es necesario andar con ningún bucle
[url=http://www.sindominio.net/ayuda/preguntas-inteligentes]como hacer preguntas inteligentes[/url]
Sean tan amables de poner la etiqueta de (SOLUCIONADO) cuando consigan solucionar su problema
Avatar de Usuario
niky45
Forista Ancestral
Forista Ancestral
Mensajes: 9186
Registrado: Jue Abr 12, 2007 7:00 am
Ubicación: tras la pantalla (...)
Contactar:

Re: Duda bash script

Mensaje por niky45 » Lun Mar 28, 2011 4:58 pm

si la cadena se crea bien, sera cuestion de pasarsela de otra manera al programa....

prueba con esto:

Código: Seleccionar todo

programa $(echo $todo) ;
:)

por cierto, ese unset del principio sobra. (quiero decir... esta de adorno. $todo NO va a estar definida. y si sospechas que puede estarlo, ponle un nombre que no deba estarlo. ). me refiero... la unica manera de que lo este, es que tengas una variable $todo en el bashrc o similares. por lo de que si has ejecutado previamente el script, no te preocupes. las variables son locales.

:)

PD: busca info sobre arrays (en bash). bash tiene muchisima potencia trabajando con arrays, y a lo mejor te simplifica un poco las cosas. (en realidad una variable de por si es un array, pero a la hora de trabajar, si utilizas la sintaxis de los arrays, puede que te resulte mas sencillo.) la pena es que no tengo ninguna guia a mano...
la idea es pasarle a tu programa algo asi:

Código: Seleccionar todo

programa ${todo[*]} ;
este es el primer link que he visto :P http://tldp.org/LDP/abs/html/arrays.html
#446716
>>"Linux: the operating system with a CLUE... Command Line User Environment".
(seen in a posting in comp.software.testing)

[ DNFD ] - [ F4A ] - [ dotfiles ]
Bodegas
Forista Nuevo
Forista Nuevo
Mensajes: 4
Registrado: Lun Mar 28, 2011 10:32 am

Re: Duda bash script

Mensaje por Bodegas » Mar Mar 29, 2011 1:28 pm

Muchas gracias por las contestaciones.
Lo acabo de solucionar de la forma más fácil, con un simple *.pdf como dice dracel.
A veces me complico demasiado :D

niky45,
probé con esto programa $(echo $todos) ;
pero no funciona.
Gracias por el link de los arrays, le echaré un vistazo :)

Editado -- Mar Mar 29, 2011 5:28 am --

Pero ahora me surge otra duda.
¿Cómo puedo pasar un argumento que incluya comillas a un programa?
Porque está claro que escapando las comillas no funciona.

Por ejemplo, si quiero hacer un script que me busque un fichero:
En la linea de comandos haría un find / -xdev -name '*palabra*'

¿pero en un script?
find / -xdev -name '*$1*';

¿Cómo escapo las comillas simples para que me las reconozca como comillas?
Avatar de Usuario
dracel
Forista Mayor
Forista Mayor
Mensajes: 634
Registrado: Sab Jun 07, 2008 7:00 am
Ubicación: España/Galicia/Pontevedra/Baiona/Sabaris

Re: Duda bash script

Mensaje por dracel » Mar Mar 29, 2011 5:11 pm

Creo que no comprendes como hace las expansiones bash
Ejecuta estos comandos y observa como se comporta

Código: Seleccionar todo

echo *
echo "*"
Viendo esto te darás cuenta de que bastara con que ejecutes

Código: Seleccionar todo

 find -xdev -name "$1"
Y para que lo coja bien al ejecutar el programa pongas como entrada "*palabra*"
Espero haberme explicado bien, ya que no me resulta fácil
[url=http://www.sindominio.net/ayuda/preguntas-inteligentes]como hacer preguntas inteligentes[/url]
Sean tan amables de poner la etiqueta de (SOLUCIONADO) cuando consigan solucionar su problema
Bodegas
Forista Nuevo
Forista Nuevo
Mensajes: 4
Registrado: Lun Mar 28, 2011 10:32 am

Re: Duda bash script

Mensaje por Bodegas » Vie Abr 01, 2011 9:10 am

No, si mi problema no está en los *. El problema está en los caracteres especiales y la necesidad de entrecomillar los nombres de archivos por si acaso.
Entiendo tu idea, pasar las comillas en el propio argumento. Así funciona, sí.
Pero sigo sin saber como pasar un argumento con comillas a un comando de linux.
Avatar de Usuario
niky45
Forista Ancestral
Forista Ancestral
Mensajes: 9186
Registrado: Jue Abr 12, 2007 7:00 am
Ubicación: tras la pantalla (...)
Contactar:

Re: Duda bash script (SOLUCIONADO)

Mensaje por niky45 » Vie Abr 01, 2011 12:30 pm

asi??
programa '"mi argumento"'
auqnue se supone, que simplemente escapandolas deberia funcionar....
programa "\"mi argumento\""
#446716
>>"Linux: the operating system with a CLUE... Command Line User Environment".
(seen in a posting in comp.software.testing)

[ DNFD ] - [ F4A ] - [ dotfiles ]
Bodegas
Forista Nuevo
Forista Nuevo
Mensajes: 4
Registrado: Lun Mar 28, 2011 10:32 am

Re: Duda bash script (SOLUCIONADO)

Mensaje por Bodegas » Lun Abr 04, 2011 9:49 pm

No, así no funciona.
Pruébalo con un simple find.
find /home -name "\"algo\""

no te va a encontrar nada porque yo creo que interpreta las comillas como texto.

Y así tampoco
programa '"mi argumento"'
Avatar de Usuario
niky45
Forista Ancestral
Forista Ancestral
Mensajes: 9186
Registrado: Jue Abr 12, 2007 7:00 am
Ubicación: tras la pantalla (...)
Contactar:

Re: Duda bash script (SOLUCIONADO)

Mensaje por niky45 » Mar Abr 05, 2011 7:59 pm

[19:56:53] - [niky@ian:~]
>>> find /home -name "\"proc\""

[19:57:02] - [niky@ian:~]
>>> find /home -name "proc"

[19:57:07] - [niky@ian:~]
>>> lsg proc
Grepping for files matching proc...
proc_diskstats.log
proc_ps.log
proc_stat.log

[19:57:12] - [niky@ian:~]
>>>
no, con find no funciona. pero porque tampoco funciona si se lo paso con comillas sin mas...

el tema es... tu "problema" es que tienes un programa al que le quieres pasar un nombre de archivo con espacios, no???

Código: Seleccionar todo

[19:59:19] - [niky@ian:~]
>>> cp "proc_stat.log"  /tmp/ -v
`proc_stat.log' -> `/tmp/proc_stat.log'

[19:59:25] - [niky@ian:~]
>>> cp "\"proc_stat.log"\"  /tmp/ -v
cp: cannot stat `"proc_stat.log"': No such file or directory

[19:59:31] - [niky@ian:~]
>>> cp "\"proc_stat.log\""  /tmp/ -v
cp: cannot stat `"proc_stat.log"': No such file or directory

[19:59:54] - [niky@ian:~]
>>> 

ciertamente, esta interpretando como que las comillas son parte del argumento. que por que?? ni idea. tal vez en el man de bash venga algo. deberias echarle un ojo. :?
#446716
>>"Linux: the operating system with a CLUE... Command Line User Environment".
(seen in a posting in comp.software.testing)

[ DNFD ] - [ F4A ] - [ dotfiles ]
Avatar de Usuario
hipersayan_x
Forista Legendario
Forista Legendario
Mensajes: 1905
Registrado: Vie Abr 27, 2007 7:00 am
Contactar:

Re: Duda bash script (SOLUCIONADO)

Mensaje por hipersayan_x » Mar Abr 05, 2011 9:50 pm

Muy interesante, se me ocurre que podrías intentar usando listas:

Código: Seleccionar todo

argumentos=$( "archivo 1.pdf" "archivo 2.pdf" "archivo 3.pdf" )
programa ${argumentos[@]}
Desarrollo en Qt: Qt Developer Network
Mis proyectos: github | SourceForge.net
Responder
  • Similar Topics
    Respuestas
    Vistas
    Último mensaje