Problema con este script en bash [SOLUCIONADO]

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

Moderadores: maiku, akodo

Responder
Avatar de Usuario
elmohino
Forista Menor
Forista Menor
Mensajes: 95
Registrado: Lun Oct 20, 2008 7:00 am

Problema con este script en bash [SOLUCIONADO]

Mensaje por elmohino »

Hola a todos/as.


Me he creado este sencillo script en bash para poder volcar emisiones en streaming o en descarga codificándolas automáticamente a MP3:

Código: Seleccionar todo

#!/bin/bash

# Este script sirve para volcar y codificar a MP3 una emisión en streaming o en descarga de audio o vídeo
# CÓMO USAR: ./mp3enc2 [URL_de_streaming] [bitrate] [frecuencia{8|11.025|12|16|22.05|24|32|44.1|48}]

# NOTA: NO es posible usar: cat "[nombre_lista]" | while read URL; do ./mp3enc2 .....


mkfifo /tmp/MP3

KEY=$(echo $1 | cut -d'/' -f3)
NOW=$(date +%F-%H.%M.%S)

lame -h -b $2 --resample $3 /tmp/MP3 "$KEY"_"$NOW".mp3 &

mplayer -novideo $1 -ao pcm:file=/tmp/MP3

rm /tmp/MP3

mp3gain -c -r -d 5.0 "$KEY"_"$NOW".mp3

Bien. Si invoco el script con solamente una URL, p.e.:

Código: Seleccionar todo

./mp3enc2 http://www.ivoox.com/cofrentes-accion-greenpeace-15-02-11-1-conexion_md_535136_1.mp3 32 44.1
el volcado y codificado a 32kbps con 44100 Hz en MP3 es correcto.

El problema viene cuando intento pasarle al script un archivo de texto con un listado de URL's a volcar de la siguiente manera:

Código: Seleccionar todo

cat [archivo_texto] | while read URL; do ./mp3enc2 $URL 32 44.1; done
De la anterior manera solamente se me vuelca la primera URL de la lista y el script se detiene. No entiendo qué es lo que falla. Con otros scripts no me pasa.


Muchas gracias.

Salud.
Última edición por elmohino el Mar Feb 15, 2011 9:13 pm, editado 1 vez en total.

Avatar de Usuario
victorhck
Forista Mayor
Forista Mayor
Mensajes: 688
Registrado: Mié Feb 09, 2011 11:43 am
Ubicación: /HOME
Contactar:

Re: Problema con este script en bash

Mensaje por victorhck »

Hola!
En [nombre_lista] estan las URL's que quieres descargar? Y cada una está en una línea?

Puedes saber el número de lineas que tiene el fichero [nombre_lista] con:

Código: Seleccionar todo

lineas=$(wc -l $HOME/ruta/nombre_lista.txt)
y despues con un while ir linea por linea metiendo en una variable el nombre de la URL

Código: Seleccionar todo

while [ $lineas != 0 ] 
do
  archivo=$(head -$lineas $HOME/ruta/nombre_lista.txt | tail -1)
   ....
    let lineas--
done
Asi tengo yo un proyecto de script que recorre un archivo con nombres de archivos (valga la redundancia)
Saludos...

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: Problema con este script en bash

Mensaje por niky45 »

prueba con esta sintaxis:

Código: Seleccionar todo

for LINEA in $(cat fichero); do loquesea ;done
:)
#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
elmohino
Forista Menor
Forista Menor
Mensajes: 95
Registrado: Lun Oct 20, 2008 7:00 am

Re: Problema con este script en bash

Mensaje por elmohino »

Gracias, amiga niky45: FUNCIONA su método. Muchas gracias.


Sr. victorhck, gracias también por su respuesta. Sí, el [nombre_lista] lleva las URL's una por una en cada línea. Pero he modificado mi script de la siguiente manera:

Código: Seleccionar todo

#!/bin/bash

# Este script sirve para volcar y codificar a MP3 una emisión en streaming o en descarga de audio o vídeo
# CÓMO USAR: ./mp3enc2 [URL_de_streaming] [bitrate] [frecuencia{8|11.025|12|16|22.05|24|32|44.1|48}]

# NOTA: NO es posible usar: cat "[nombre_lista]" | while read URL; do ./mp3enc2 .....


mkfifo /tmp/MP3

lineas=$(wc -l $1)

while [ $lineas != 0 ]

do
  archivo=$(head -$lineas $1 | tail -1)

KEY=$(echo $archivo | cut -d'/' -f3)
NOW=$(date +%F-%H.%M.%S)

lame -h -b $2 --resample $3 /tmp/MP3 "$KEY"_"$NOW".mp3 &

mplayer -novideo $archivo -ao pcm:file=/tmp/MP3

mp3gain -c -r -d 5.0 "$KEY"_"$NOW".mp3

done

rm /tmp/MP3
y me devuelve el error:

Código: Seleccionar todo

usuario@usuario-desktop:~/Escritorio/bbb$ ./mp3enc2 des.txt 32 44.1
./mp3enc2: línea 13: [: demasiados argumentos
usuario@usuario-desktop:~/Escritorio/bbb$

Salud.

Avatar de Usuario
victorhck
Forista Mayor
Forista Mayor
Mensajes: 688
Registrado: Mié Feb 09, 2011 11:43 am
Ubicación: /HOME
Contactar:

Re: Problema con este script en bash [SOLUCIONADO]

Mensaje por victorhck »

No decrementabas 1 la variable lineas para que el while recorriera todos los archivos con el comando

Código: Seleccionar todo

 let lineas--
No sé si tendrá que ver...
De todas formas me alegro que resolvieras el problemilla.
Saludos...

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: Problema con este script en bash [SOLUCIONADO]

Mensaje por niky45 »

victorhck escribió:No decrementabas 1 la variable lineas para que el while recorriera todos los archivos con el comando

Código: Seleccionar todo

 let lineas--
No sé si tendrá que ver...
De todas formas me alegro que resolvieras el problemilla.
Saludos...
es importante, pero no para el error (aka, sin el let lineas-- no hace lo que queremos, pero el error no viene de ahi)

el error esta en la linea 13 que es la del condicional. sin embargo, si en el script estan los espacios como en el codigo de aqui, no veo el error. tal vez.. metiendo las cosas entre comillas funcione??

Código: Seleccionar todo

while [ "$lineas" != "0" ] ;do 
   ...
no obstante, liarse con let, y con tanto head y tail, me parece complicarse innecesariamente la vida, cuando con un simple cat se solcuiona. :) (pero no obstante, quiero saber que es el error que esta dando. porque yo sigo sin entender como es que no ve la condicional... si esta correcta :? )
#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
victorhck
Forista Mayor
Forista Mayor
Mensajes: 688
Registrado: Mié Feb 09, 2011 11:43 am
Ubicación: /HOME
Contactar:

Re: Problema con este script en bash [SOLUCIONADO]

Mensaje por victorhck »

en mi script aunque lo utilizo para otra cosa (que de momento no se como hacerlo :? ) si que funciona el while sin comillas y sin error...
Tampoco veo donde puede dar el problema...

Avatar de Usuario
elmohino
Forista Menor
Forista Menor
Mensajes: 95
Registrado: Lun Oct 20, 2008 7:00 am

Re: Problema con este script en bash [SOLUCIONADO]

Mensaje por elmohino »

Buenas noches de nuevo, damas y caballeros.

Bien. He añadido las modificaciones que me sugieren Vds. así de esta manera:

Código: Seleccionar todo

#!/bin/bash

# Este script sirve para volcar y codificar a MP3 una emisión en streaming o en descarga de audio o vídeo
# CÓMO USAR: ./mp3enc2 [URL_de_streaming] [bitrate] [frecuencia{8|11.025|12|16|22.05|24|32|44.1|48}]

# NOTA: NO es posible usar: cat "[nombre_lista]" | while read URL; do ./mp3enc2 .....


mkfifo /tmp/MP3

lineas=$(wc -l $1)

while [ "$lineas" != "0" ]

do
  archivo=$(head -$lineas $1 | tail -1)

KEY=$(echo $archivo | cut -d'/' -f3)
NOW=$(date +%F-%H.%M.%S)

lame -h -b $2 --resample $3 /tmp/MP3 "$KEY"_"$NOW".mp3 &

mplayer -novideo $archivo -ao pcm:file=/tmp/MP3

mp3gain -c -r -d 5.0 "$KEY"_"$NOW".mp3

 let lineas--

done

rm /tmp/MP3
Y el script comienza a volcar el streaming, pero crea un bucle infinito que vuelca sin parar la última URL de la lista...

Salud y gracias por su ayuda.

Avatar de Usuario
victorhck
Forista Mayor
Forista Mayor
Mensajes: 688
Registrado: Mié Feb 09, 2011 11:43 am
Ubicación: /HOME
Contactar:

Re: Problema con este script en bash [SOLUCIONADO]

Mensaje por victorhck »

Prueba con el While sin comillas (a mi me funciona sin comillas).
Puedes poner un echo de la varible $lineas como control para ver que valores va tomando.
Saludos...

Avatar de Usuario
elmohino
Forista Menor
Forista Menor
Mensajes: 95
Registrado: Lun Oct 20, 2008 7:00 am

Re: Problema con este script en bash [SOLUCIONADO]

Mensaje por elmohino »

Si le añado echo (sea con o sin comillas) me vuelve a dar el error de: "demasiados argumentos".

Salud.

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: Problema con este script en bash [SOLUCIONADO]

Mensaje por niky45 »

elmohino escribió:Si le añado echo (sea con o sin comillas) me vuelve a dar el error de: "demasiados argumentos".

Salud.
puedes pegar el codigo??

a una condicional no le puedes decir [ echo $var == valor ], le tienes que decir [ $(echo $var) == valor ]. y aun asi es redundante. lo logico es [ $var == valor ]

*pongo igual por poner algo.
:)
#446716
>>"Linux: the operating system with a CLUE... Command Line User Environment".
(seen in a posting in comp.software.testing)

[ DNFD ] - [ F4A ] - [ dotfiles ]

Responder
  • Temas similares
    Respuestas
    Vistas
    Último mensaje