[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Bash



Jaume Martin Claramonte wrote:
> Miren no me ha funcionado ningunas de las soluciones que me han dado así
> que voy a poner el trozo de código problemático.

No me queda del todo claro qué es lo que quieres hacer (¿porqué no estás
usando rename(1)?).  Pero algunas observaciones:

En tus ejemplos de código, estoy casi seguro de que quieres usar "$@",
así, con comillas, en vez de $*.  Según la documentación de bash, $* se
expande a los parámetros posicionales, concatenados.  Esto produce una
"palabra" cada vez que se encuentra espacio en blanco, e.g.,

------------------------------------------------
$ bash -c 'for i in $*; do echo "[$i]"; done' -\
 'uno' 'dos' 'dos y medio' 'tres'
[uno]
[dos]
[dos]
[y]
[medio]
[tres]
------------------------------------------------

Si, en cambio, usas "$*" entre comillas, eso se expande a una sola
palabra, con todos los argumentos concatenados y separados por $IFS:

------------------------------------------------
$ bash -c 'for i in "$*"; do echo "[$i]"; done' -\
 'uno' 'dos' 'dos y medio' 'tres'
[uno dos dos y medio tres]
------------------------------------------------

Usar $@ sin comillas es equivalente a $*.  Pero cuando usas "$@" con
comillas, cada parámetro se hace una palabra, sin importar si contiene
espacios u otros caracteres problemáticos:

------------------------------------------------
$ bash -c 'for i in "$@"; do echo "[$i]"; done' -\
 'uno' 'dos' 'dos y medio' 'tres'
[uno]
[dos]
[dos y medio]
[tres]
------------------------------------------------

La segunda observación es que bash efectivamente soporta una especie de
listas.  Arreglos, específicamente.  Un arreglo se declara con algo como:

------------------------------------------------
ARREGLO=('uno' 'dos' 'dos y medio' 'tres')
------------------------------------------------

Y se usa así:

------------------------------------------------
echo "Longitud del arreglo: ${#ARREGLO[@]}"
echo "Primer elemento: ${ARREGLO[0]}"
echo "Siguiente: ${ARREGLO[1]}, etc."

echo "Enumerando con * sin comillas:"
for i in ${ARREGLO[*]}; do echo "[$i]"; done

echo "Enumerando con * con comillas:"
for i in "${ARREGLO[*]}"; do echo "[$i]"; done

echo "Enumerando con @ con comillas:"
for i in "${ARREGLO[@]}"; do echo "[$i]"; done
------------------------------------------------

La salida del código anterior es la siguiente:

------------------------------------------------
Longitud del arreglo: 4
Primer elemento: uno
Siguiente: dos, etc.
Enumerando con * sin comillas:
[uno]
[dos]
[dos]
[y]
[medio]
[tres]
Enumerando con * con comillas:
[uno dos dos y medio tres]
Enumerando con @ con comillas:
[uno]
[dos]
[dos y medio]
[tres]
------------------------------------------------

Finalmente, si lo que quieres es cargar la lista de archivos en un
directorio como elementos en un arreglo, usa algo como esto:

------------------------------------------------
ARREGLO=(/ruta/a/tus/archivos/*.mp3)
------------------------------------------------

Cada nombre que haga match con el patrón quedará en un elemento del
arreglo, sin importar si contiene espacios, comillas, etc.

Espero que esto te ayude para modificar tu código de manera que
funcione.  Y ve el manual bash(1).  Es denso, pero todas las respuestas
están ahí.  O casi todas :)

-- 
César Rincón
http://mengambrea.blogspot.com/



Reply to: