Próbuję napisać niezwykle prosty skrypt w Ubuntu, który pozwoliłby mi przekazać mu nazwę pliku lub katalogu i móc zrobić coś konkretnego, gdy jest to plik, i coś innego, gdy jest to katalog. Problem, który mam, polega na tym, że nazwa katalogu lub prawdopodobnie również pliki zawiera spacje lub inne znaki ucieczki w nazwie.
Oto mój podstawowy kod poniżej i kilka testów.
#!/bin/bash
PASSED=$1
if [ -d "${PASSED}" ] ; then
echo "$PASSED is a directory";
else
if [ -f "${PASSED}" ]; then
echo "${PASSED} is a file";
else
echo "${PASSED} is not valid";
exit 1
fi
fi
A oto wynik:
andy@server~ $ ./scripts/testmove.sh /home/andy/
/home/andy/ is a directory
andy@server~ $ ./scripts/testmove.sh /home/andy/blah.txt
/home/andy/blah.txt is a file
andy@server~ $ ./scripts/testmove.sh /home/andy/blah\ with\ a\ space.txt
/home/andy/blah with a space.txt is not valid
andy@server~ $ ./scripts/testmove.sh /home/andy\ with\ a\ space/
/home/andy with a space/ is not valid
Wszystkie te ścieżki są prawidłowe i istnieją.
if
-else
konstrukcje w Bash również obsługująelif
. Po prostu FYI.Odpowiedzi:
To powinno działać. Nie jestem pewien, dlaczego to zawodzi. Prawidłowo cytujesz swoje zmienne. Co się stanie, jeśli użyjesz tego skryptu z double
[[
]]
?Podwójne nawiasy kwadratowe to rozszerzenie bash do
[ ]
. Nie wymaga cytowania zmiennych, nawet jeśli zawierają spacje.Warto również spróbować:
-e
sprawdzić, czy ścieżka istnieje, bez sprawdzania, jakiego typu jest to plik.źródło
Przynajmniej napisz kod bez krzaczastego drzewa:
Kiedy umieszczam to w pliku „xx.sh”, tworzę plik „xx sh” i uruchamiam go, otrzymuję:
Biorąc pod uwagę, że masz problemy, powinieneś debugować skrypt, dodając:
To pokaże ci, co
ls
sądzi o nazwach, które przekazujesz skryptowi.źródło
Użycie polecenia „plik” może być do tego przydatne:
Przykłady wyników:
Do Twojej wiadomości: powyższe odpowiedzi działają, ale możesz użyć -s, aby pomóc w dziwnych sytuacjach, sprawdzając najpierw prawidłowy plik:
źródło
-s
szuka niepustego pliku, takiego o rozmiarze niezerowym)? I nie wydrukujesz żadnej diagnozy dla bloku specjalnego, specjalnego znaku, FIFO itp.? Dowiązania symboliczne prawdopodobnie prowadzą do tego, co znajduje się na drugim końcu łącza; uszkodzone linki symboliczne są bardziej problematyczne.--brief
flagifile
. Wyprowadza tylkodirectory
wtedy, gdy jest.Używanie
-f
i-d
włączanie/bin/test
:źródło
test
Zwykle powłoka wbudowany, choć zwykle jest plikiem wykonywalnym, takich jak/bin/test
, a także/bin/[
.)Bardziej eleganckie rozwiązanie
źródło
if [ -f "$x" ]
.źródło
To powinno działać:
źródło
źródło
Jedna wkładka
wynik to prawda (0) (katalog) lub prawda (0) (plik) lub fałsz (1) (żadne)
źródło
touch bob
zmkdir bob
, mam wyjścia:dir
afile
na dwóch liniach.