2011-09-23 21 views
16

Mam skrypt basha, który odbiera zestaw plików od użytkownika. Te pliki są czasami w katalogach ze spacjami w ich nazwach. Niestety w przeciwieństwie do this question wszystkie nazwy plików są przekazywane za pośrednictwem interfejsu wiersza poleceń. Załóżmy, że ścieżki są poprawnie cytowane, ponieważ są one przekazywane przez użytkownika, więc spacje (zapisz w cudzysłowach) są ogranicznikami między ścieżkami. Jak przesłać te parametry do podprogramu w moim skrypcie Bash w sposób, który zachowa cytowane spacje?bash: przekazywanie ścieżek ze spacjami jako parametrami?

Odpowiedz

19
#! /bin/bash 

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

Uwaga na nadmierne wykorzystanie ofert. Wszystko jest konieczne.

Przechodząc wszystkie argumenty do innego programu jest jeszcze prostsza:

process-all-together "[email protected]" 

Trudne sprawa jest, gdy chcesz podzielić argumenty na pół. To wymaga dużo więcej kodu w prostej powłoce POSIX. Ale może Bash ma jakieś specjalne cechy.

+0

Dzięki; co jeśli muszę je przetworzyć zbiorczo? – fbrereto

+0

Zaktualizowałem moją odpowiedź. –

+1

Upewnij się również, że podprogram prawidłowo podwójnie cytuje wszystko, np. 'process-one-file-at-a-time() {cp" $ 1 "" backupdir/$ (basename "$ 1") "; } ' –

0
"$var" 

Na przykład

$ var='foo bar' 

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

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

Chcesz "[email protected]", który posiada specjalną składnię rozszerza [email protected] ale zachowując white-space powołując rozmówcy (nie utworzyć jeden gigantyczny ciąg ze wszystkimi argumenty w nim zawarte). Więc ktoś może wywołać skrypt jak:

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

Następnie w skrypcie można robić takie rzeczy jak:

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

i dostać dwa wiersze wyjścia (nie 5).

Przeczytaj paragraf o parametrze Special "@" tutaj: http://www.gnu.org/s/bash/manual/bash.html#Special-Parameters

0

Bravo @Roland. To dużo dla twojego rozwiązania

To naprawdę zadziałało!

Napisałem prostą funkcję skryptu, która otwiera daną ścieżkę z Nautilusem.

I właśnie zagnieżdżone funkcję z tego „pomocnika” -do pętli do głównej funkcji:

fmp() { 

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

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

teraz jestem w stanie zrobić wszystko moje skrypty postępowania Pracować ze ścieżkami po prostu obracając je do zagnieżdżonych funkcji zapakowanych przez funkcję z tą helper-for-loop.

Powiązane problemy