J'ai un script bash qui reçoit un ensemble de fichiers de l'utilisateur. Ces fichiers sont parfois sous des répertoires avec des espaces dans leurs noms. Malheureusement, contrairement à this question tous les noms de fichiers sont transmis via l'interface de ligne de commande. Supposons que les chemins soient correctement indiqués lorsqu'ils sont passés par l'utilisateur, donc les espaces (sauf pour les espaces entre guillemets) sont des délimiteurs entre les chemins. Comment est-ce que je transmettrais ces paramètres à un sous-programme dans mon script bash d'une manière qui préserve les espaces cités?bash: passer des chemins avec des espaces comme paramètres?
Répondre
#! /bin/bash
for fname in "[email protected]"; do
process-one-file-at-a-time "$fname"
done
Notez l'utilisation excessive de guillemets. Tout est nécessaire.
En passant tous les arguments à un autre programme est encore plus simple:
process-all-together "[email protected]"
L'affaire délicate est quand vous voulez diviser les arguments en deux. Cela nécessite beaucoup plus de code dans un simple shell POSIX. Mais peut-être que le Bash a des caractéristiques spéciales.
"$var"
Par exemple,
$ var='foo bar'
$ perl -E'say "<<$_>>" for @ARGV' $var
<<foo>>
<<bar>>
$ perl -E'say "<<$_>>" for @ARGV' "$var"
<<foo bar>>
Vous voulez "[email protected]"
, qui a la syntaxe particulière de l'expansion [email protected]
mais en préservant l'espace blanc citant de l'appelant (il ne crée pas une seule chaîne géante avec tous les les arguments dedans). Alors quelqu'un peut appeler votre script comme:
bash-script.sh AFile "Another File With Spaces"
Ensuite, dans votre script, vous pouvez faire des choses comme:
for f in "[email protected]"; do
echo "$f";
done
et obtenir deux lignes de sortie (non 5).
Lisez le paragraphe sur le paramètre spécial "@" ici: http://www.gnu.org/s/bash/manual/bash.html#Special-Parameters
Bravo @Roland. Beaucoup pour votre solution
Ça a vraiment marché!
J'ai écrit une fonction de script simple qui ouvre un chemin donné avec nautilus.
Je viens imbriqué une fonction avec cette « aide » -pour boucle dans la fonction principale:
fmp() {
fmp2() {
nautilus "[email protected]";
};
for fname in "[email protected]";
do
fmp2 "$fname";
done;
}
Maintenant, je suis en mesure de faire tous mes scripts travail manipulant des chemins tout en tournant les dans des fonctions imbriquées enveloppées par une fonction avec cette aide-à-boucle.
- 1. Essayer de passer la variable bash avec des espaces
- 2. bash: expansion des variables avec des espaces
- 3. Passer une chaîne avec des espaces comme argument de fonction dans bash
- 4. les variables Bash avec des espaces
- 5. Comment passer des paramètres avec des espaces via le système cstdlib
- 6. Suppression des répertoires avec des espaces avec bash
- 7. Comment utiliser cscope avec des chemins contenant des espaces
- 8. Xml avec des espaces comme
- 9. runtime.exec avec des espaces dans les paramètres
- 10. Passer des paramètres à bash lors de l'exécution d'un script
- 11. PHP: passer une fonction avec des paramètres comme paramètre
- 12. Comment passer des paramètres de bash au script php?
- 13. Comment passer des paramètres avec des espaces en tant que tableau à RoboCopy dans Powershell?
- 14. Script Bash pour taper des dossiers avec des espaces
- 15. Tri des nombres délimités par des espaces avec Linux/Bash
- 16. Comment faire jom.exe de Qt Creator pour copier des fichiers dans des chemins avec des espaces?
- 17. trouver UNIX: comment gérer des chemins contenant des espaces
- 18. Envoyer une chaîne avec des espaces comme message de validation git en utilisant bash
- 19. Passer des paramètres à Powershell
- 20. Bash complétion avec aucun mot délimité par des espaces
- 21. Où stocker des variables globales (comme des chemins) en C#?
- 22. Comment passer des paramètres avec REST Rails
- 23. basename avec des espaces dans un script bash?
- 24. Passer des paramètres avec Seam, RichFaces & PopupPanel
- 25. Passer des paramètres avec plusieurs objets
- 26. Passer des références de contrôle comme paramètres ref
- 27. passer des paramètres d'une fonction noyau comme struct C++?
- 28. Boucle sur les répertoires avec des espaces dans Bash
- 29. Importer des modules avec des chemins variables?
- 30. Passer des paramètres en utilisant |
Merci; Et si je dois les traiter en vrac? – fbrereto
J'ai mis à jour ma réponse. –
Assurez-vous également que le sous-programme double correctement toutes les valeurs, par ex. 'process-un-fichier-à-un-temps() {cp" $ 1 "" backupdir/$ (basename "$ 1") "; } ' –