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
#! /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.
"$var"
Por ejemplo,
$ var='foo bar'
$ perl -E'say "<<$_>>" for @ARGV' $var
<<foo>>
<<bar>>
$ perl -E'say "<<$_>>" for @ARGV' "$var"
<<foo bar>>
¿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
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.
- 1. PowerShell: paso de rutas calculadas con espacios
- 2. Métodos de paso de Objective-C como parámetros
- 3. ¿Cómo paso parámetros nombrados con Invoke-Command?
- 4. ¿Cómo paso las enumeraciones de Scala como parámetros?
- 5. ¿Cómo paso referencias como parámetros de método en AppDomains?
- 6. Windows Server 2008 como máquina de desarrollo - paso a paso
- 7. Paso de parámetros de estilo en Perl
- 8. Pasar una cadena con espacios como un argumento de función en bash
- 9. Scala parámetros de tipo paso a objeto
- 10. Bash: buscar archivos con espacios al final de las líneas
- 11. Python: paso de parámetros por nombre
- 12. ¿Cómo paso múltiples parámetros en Objective-C?
- 13. nombre base con espacios en un script bash?
- 14. Acerca del paso de muchos parámetros
- 15. paso de parámetros en el informe cristalino
- 16. Autofac paso de parámetros y autowiring
- 17. ¿Espacios en alias de Cygwin/bash?
- 18. Primeros pasos con Oracle Database
- 19. Primeros pasos con ColdFusion?
- 20. Ordenando números delimitados por espacios con Linux/Bash
- 21. bash ordenar por orden inusual. Problema con los espacios?
- 22. Bucle en directorios con espacios en blanco en Bash
- 23. Citas de parámetros de Bash y eval
- 24. Necesita un WCF paso a paso como servicio de Windows
- 25. groovy ejecutar con los parámetros que contienen espacios
- 26. Ejecutar con los parámetros
- 27. ¿Cómo paso múltiples parámetros en la URL?
- 28. Rango de Python() con pasos negativos
- 29. Cómo pasar parámetros con espacios a través del sistema cstdlib
- 30. Reutilizar Pasos de pepino
Gracias; ¿y si necesito procesarlos a granel? – fbrereto
Actualicé mi respuesta. –
Además, asegúrese de que la subrutina doble apropiadamente todo, p. 'process-one-file-at-a-time() {cp" $ 1 "" backupdir/$ (nombre base "$ 1") "; } ' –