Ho uno script di bash che riceve un set di file dall'utente. Questi file sono talvolta sotto directory con spazi nei loro nomi. Sfortunatamente a differenza di this question tutti i nomi di file vengono passati tramite l'interfaccia della riga di comando. Supponiamo che i percorsi siano correttamente citati man mano che vengono passati dall'utente, quindi gli spazi (salvati per gli spazi quotati) sono delimitatori tra i percorsi. Come potrei inoltrare questi parametri a una subroutine all'interno del mio script bash in modo da preservare gli spazi quotati?bash: percorsi di passaggio con spazi come parametri?
risposta
#! /bin/bash
for fname in "[email protected]"; do
process-one-file-at-a-time "$fname"
done
Nota l'uso eccessivo di preventivi. È tutto necessario
Passando tutti gli argomenti in un altro programma è ancora più semplice:
process-all-together "[email protected]"
Il caso difficile è quando si desidera dividere gli argomenti a metà. Ciò richiede molto più codice in una semplice shell POSIX. Ma forse il Bash ha alcune caratteristiche speciali.
"$var"
Per esempio,
$ var='foo bar'
$ perl -E'say "<<$_>>" for @ARGV' $var
<<foo>>
<<bar>>
$ perl -E'say "<<$_>>" for @ARGV' "$var"
<<foo bar>>
Volete "[email protected]"
, che ha la speciale sintassi di espandere [email protected]
ma conservando la white-space citando del chiamante (non crea una singola stringa gigante con tutti gli argomenti in esso contenuti). Così qualcuno può chiamare il tuo script come:
bash-script.sh AFile "Another File With Spaces"
Poi, nel vostro script si possono fare cose come:
for f in "[email protected]"; do
echo "$f";
done
e ottenere due linee di uscita (non 5).
leggere il paragrafo sul parametro speciale "@" qui: http://www.gnu.org/s/bash/manual/bash.html#Special-Parameters
Bravo @Roland. Grazie mille per la tua soluzione
Ha funzionato davvero!
Ho scritto una semplice funzione di script che apre un determinato percorso con Nautilus.
E ho appena nidificato una funzione con questo "aiuto" -per-loop nella funzione principale:
fmp() {
fmp2() {
nautilus "[email protected]";
};
for fname in "[email protected]";
do
fmp2 "$fname";
done;
}
Ora io sono in grado di fare tutti i miei script Maneggiamento con percorsi semplicemente ruotando in funzioni annidate avvolte da una funzione con questo helper-for-loop.
- 1. PowerShell - passaggio di percorsi calcolati con spazi
- 2. Passaggio di argomenti con spazi tra (bash) lo script
- 3. passaggio dei parametri al controllore azione attraverso percorsi
- 4. Parametri del passaggio con EventEmitter
- 5. Knockout.js - parametri di passaggio
- 6. Condizioni Generali di parametri percorsi
- 7. Passaggio di più parametri con $. Ajax url
- 8. Parametri di passaggio ASP.Net
- 9. Nome file con spazi in BASH
- 10. Come passare parametri con spazi tramite il sistema cstdlib
- 11. Ciclo su directory con spazi in Bash
- 12. basename con spazi in uno script bash?
- 13. Percorsi con i parametri facoltativi a Suave
- 14. Come gestire i percorsi lunghi in Bash?
- 15. Passaggio di parametri aggiuntivi in React Router
- 16. passaggio di parametri in Java
- 17. Come funziona l'espansione dei parametri di Bash?
- 18. parametri di script in Bash
- 19. MENO @import: passaggio dei percorsi a lessc
- 20. Spazi negli alias Cygwin/bash?
- 21. passaggio vuoto variabile in bash
- 22. Concatenazione di spazi bianchi in Bash
- 23. Sostituire gli spazi con caratteri di sottolineatura tramite BASH
- 24. Passaggio di parametri di navigazione complessi con MvvmCross ShowViewModel
- 25. Parametri di override in percorsi nidificati
- 26. java configurazione/passaggio di parametri di progettazione
- 27. Python: passaggio parametri per nome
- 28. Parametri del passaggio all'oggetto XMLHttpRequest
- 29. Bash - Passaggio di argomenti per riferimento
- 30. Passaggio di variabili in awk da bash
Grazie; cosa succede se ho bisogno di elaborarli alla rinfusa? – fbrereto
Ho aggiornato la mia risposta. –
Inoltre, assicurarsi che la subroutine racchiuda correttamente correttamente tutto, ad es. 'process-one-file-at-a-time() {cp" $ 1 "" backupdir/$ (basename "$ 1") "; } ' –