2015-05-06 25 views
10

Mam skrypt bash:Jeśli plik istnieje i nie jest pusty. Zawsze daje mi fałszywą wartość

echo " enter file name " 
read $file 
if [ -f "$file" ] && [ -s "$file" ] 
then 
    echo " file does not exist, or is empty " 
else 
    echo " file exists and is not empty " 
fi 

Bez względu na to, co mam wpisać jako $file, to daje mi wartość false. Mogę nawet wprowadzić plik, który nawet nie istnieje, Nadal da mi fałszywą wartość. Dlaczego ci faceci? Dzięki z góry

+0

Trzeba spację po '' && – rojomoke

+0

To był mój błąd edycji, naprawiłem go. Ale to rozwiązanie nie działa. – semkius

+0

I testy '-f' dla istniejącego pliku, ale masz go w części" nie istnieje " – rojomoke

Odpowiedz

25

Wystarczy sprawdzić -s, bo mówi:

plik istnieje i ma rozmiar większy niż zero

http://unixhelp.ed.ac.uk/CGI/man-cgi?test

również swoją wyjście jest przełączane , więc wyświetla does not exists, gdy plik istnieje, ponieważ -s da TRUE, jeśli plik istnieje i ma size > 0.

Więc prawidłowo należy użyć:

echo " enter file name " 
read file 
if [ -s "$file" ] 
then 
    echo " file exists and is not empty " 
else 
    echo " file does not exist, or is empty " 
fi 

To daje oczekiwany wynik.

także powinno być

read file 

zamiast

read $file 

Jeśli chcesz dalsze informacje, polecam czytanie man test i man read

+0

Dzięki. Zadziałało. – semkius

0

Należy pamiętać, że [ -f "$file" ] && [ -s "$file" ] powróci true jeśli plik istnieje i nie jest pusty.

Inny wariant:

if [[ -f "/path/to/file" && -s "/path/to/file" ]]; then 
    echo "exist and not empty" 
else 
    echo "not exist or empty"; 
fi 
Powiązane problemy