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
#! /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.
"$var"
Na przykład
$ var='foo bar'
$ perl -E'say "<<$_>>" for @ARGV' $var
<<foo>>
<<bar>>
$ perl -E'say "<<$_>>" for @ARGV' "$var"
<<foo bar>>
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
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.
Dzięki; co jeśli muszę je przetworzyć zbiorczo? – fbrereto
Zaktualizowałem moją odpowiedź. –
Upewnij się również, że podprogram prawidłowo podwójnie cytuje wszystko, np. 'process-one-file-at-a-time() {cp" $ 1 "" backupdir/$ (basename "$ 1") "; } ' –