2011-09-23 18 views
16

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

19
#! /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.

+0

Grazie; cosa succede se ho bisogno di elaborarli alla rinfusa? – fbrereto

+0

Ho aggiornato la mia risposta. –

+1

Inoltre, assicurarsi che la subroutine racchiuda correttamente correttamente tutto, ad es. 'process-one-file-at-a-time() {cp" $ 1 "" backupdir/$ (basename "$ 1") "; } ' –

0
"$var" 

Per esempio,

$ var='foo bar' 

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

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

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

0

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.