Если файл существует и не пуст. Всегда дает мне ложное значение

У меня есть сценарий bash:

 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

Независимо от того, что я ввел как $file, это дает мне ложное значение. Я даже могу ввести файл, который даже не существует, он все равно даст мне ложное значение. Почему эти парни? заранее спасибо

Ответ 1

Достаточно проверить -s, потому что он говорит:

ФАЙЛ существует и имеет размер больше нуля

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

также ваш выход переключается, поэтому его выходы does not exists когда файл существует, потому что -s выдаст TRUE если файл существует и имеет size > 0.

Поэтому правильно вы должны использовать:

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

Это даст вам ожидаемый результат.

Также это должно быть

read file

вместо

read $file

Если вы хотите получить дополнительную информацию, я рекомендую прочитать man test man read а man read

Ответ 2

Обратите внимание, что [ -f "$file" ] && [ -s "$file" ] вернет true если файл существует и не пуст.

Другой вариант:

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