2011-09-23 14 views
16

Tengo un script bash que recibe un conjunto de archivos del usuario. Estos archivos a veces están en directorios con espacios en sus nombres. Desafortunadamente a diferencia de this question, todos los nombres de archivo se pasan a través de la interfaz de línea de comando. Supongamos que las rutas se citan correctamente a medida que el usuario las pasa, por lo que los espacios (salvo los espacios entre comillas) son delimitadores entre las rutas. ¿Cómo podría reenviar estos parámetros a una subrutina dentro de mi script bash de una manera que preserve los espacios cotizados?bash: ¿pasos de paso con espacios como parámetros?

Respuesta

19
#! /bin/bash 

for fname in "[email protected]"; do 
    process-one-file-at-a-time "$fname" 
done 

Tenga en cuenta el uso excesivo de las comillas. Todo es necesario

pasar todos los argumentos a otro programa es aún más simple:

process-all-together "[email protected]" 

El caso es complicado cuando se desea dividir los argumentos por la mitad. Eso requiere mucho más código en un simple shell POSIX. Pero tal vez el Bash tiene algunas características especiales.

+0

Gracias; ¿y si necesito procesarlos a granel? – fbrereto

+0

Actualicé mi respuesta. –

+1

Además, asegúrese de que la subrutina doble apropiadamente todo, p. 'process-one-file-at-a-time() {cp" $ 1 "" backupdir/$ (nombre base "$ 1") "; } ' –

0
"$var" 

Por ejemplo,

$ var='foo bar' 

$ perl -E'say "<<$_>>" for @ARGV' $var 
<<foo>> 
<<bar>> 

$ perl -E'say "<<$_>>" for @ARGV' "$var" 
<<foo bar>> 
3

¿Quieres "[email protected]", que tiene la sintaxis especial de ampliar [email protected] pero conservando el espacio en blanco cita de la persona que llama (no crea una única cadena gigante con todo los argumentos en ella). Así que alguien puede llamar a su guión como:

bash-script.sh AFile "Another File With Spaces" 

Luego, en la secuencia de comandos que puede hacer cosas como:

for f in "[email protected]"; do 
    echo "$f"; 
done 

y obtener dos líneas de salida (no 5).

lea el párrafo sobre el parámetro especial "@" aquí: http://www.gnu.org/s/bash/manual/bash.html#Special-Parameters

0

Bravo @Roland. Eso es mucho para su solución

¡Realmente ha funcionado!

Escribí una función de script simple que abre una ruta determinada con nautilus.

y acabo anidado una función con esta "ayuda" -para-bucle en la función principal:

fmp() { 

    fmp2() { 
     nautilus "[email protected]"; 
    }; 

    for fname in "[email protected]"; 
    do   
     fmp2 "$fname";   
    done; 
} 

Ahora soy capaz de hacer que todos mis guiones Manejo de trabajos con las rutas con sólo girar en funciones anidadas envueltas por una función con este helper-for-loop.

Cuestiones relacionadas