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: akodo, maiku

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 » Mar Feb 15, 2011 8:24 pm

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: 657
Registrado: Mié Feb 09, 2011 11:43 am
Ubicación: /HOME
Contactar:

Re: Problema con este script en bash

Mensaje por victorhck » Mar Feb 15, 2011 8:40 pm

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...
Registered user: #528067
openSUSE Tumbleweed + KDE

-- mi blog --
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 » Mar Feb 15, 2011 8:42 pm

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 » Mar Feb 15, 2011 9:19 pm

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: 657
Registrado: Mié Feb 09, 2011 11:43 am
Ubicación: /HOME
Contactar:

Re: Problema con este script en bash [SOLUCIONADO]

Mensaje por victorhck » Mar Feb 15, 2011 9:38 pm

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...
Registered user: #528067
openSUSE Tumbleweed + KDE

-- mi blog --
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 » Mar Feb 15, 2011 9:56 pm

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: 657
Registrado: Mié Feb 09, 2011 11:43 am
Ubicación: /HOME
Contactar:

Re: Problema con este script en bash [SOLUCIONADO]

Mensaje por victorhck » Mar Feb 15, 2011 10:12 pm

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...
Registered user: #528067
openSUSE Tumbleweed + KDE

-- mi blog --
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 » Mié Feb 16, 2011 11:55 pm

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: 657
Registrado: Mié Feb 09, 2011 11:43 am
Ubicación: /HOME
Contactar:

Re: Problema con este script en bash [SOLUCIONADO]

Mensaje por victorhck » Jue Feb 17, 2011 10:52 am

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...
Registered user: #528067
openSUSE Tumbleweed + KDE

-- mi blog --
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 » Jue Feb 17, 2011 6:08 pm

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 » Vie Feb 18, 2011 1:13 am

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
  • Similar Topics
    Respuestas
    Vistas
    Último mensaje