Mam zmienną o nazwie var, która przechowuje listę plików w katalogu. Przeglądam wszystkie pliki i jeśli znajdę katalog, wypisuję na ekranie „Katalog”. kod poniżej:
var=$(ls dir)
for file in $var; do
if [ -d $dir/$file ]; then
echo "Directory"
fi
done
Mam 2 pytania:
Po pierwsze: robię to wewnątrz funkcji i chcę, aby zmienna pliku $ pozostała lokalna, więc kiedy moja funkcja się zakończy, nie mam do niej dostępu. Jak ustawić tę zmienną lokalnie? Nie mogę for local file in $var;
i nie mogę zadeklarować pliku $ przed zapętleniem.
2. Moja pętla nie działa, gdy $(ls dir)
zawiera plik ze spacją w nazwie. Na przykład, jeśli $dir
ma 3 pliki, plik 1 plik 2 i plik 3, $var
tylko pliki 1 i 3 będą przechowywane jako prawdziwe pliki, ale plik 2 nie będzie działał, ponieważ podzieliłby go na plik 2 i. Jak mogę rozwiązać problem z plikami, które mają miejsce w ich imiona?
źródło
"$file"
. w bardziej złożonych sytuacjach może być konieczne użycie$"$file"
.ls -Q dir
. spowoduje to umieszczenie cudzysłowów wokół każdej nazwy pliku. Ten problem jest częścią tego, dlaczego zaleca się, aby ludzie unikali analizowanials
danych wyjściowych i zamiast tego używalifind
.Odpowiedzi:
Aby ustawić plik $ lokalnie: możesz go użyć
local file
przed przypisaniem do niego.W przypadku plików ze spacjami: nie analizuj ls , użyj symboli wieloznacznych i podwójnych cudzysłowów wokół odwołań do zmiennych:
Jeśli chcesz zapisać nazwy plików przed uruchomieniem pętli, użyj tablicy zamiast zwykłej zmiennej:
Zobacz BashFAQ # 20: „Jak znaleźć i bezpiecznie obsługiwać nazwy plików zawierające znaki nowej linii, spacje lub oba?” dla bardziej złożonych przykładów i więcej sztuczek.
źródło