Что не так с моим скриптом проверки файлов?

Что не так с моим скриптом проверки файлов?

Я не понимаю, почему последняя часть моего скрипта ничего не отображает, когда не найден ни один файл или каталог.

echo -n "Please enter a filename or directory: "
read filename
if [ -z "$filename" ]; then
  echo "You did not enter anything!"
  exit 1
fi
if [ -e "$filename" ]; then
  if [ -f "$filename" ]; then
    echo "You entered a file."
  elif [ -d "$filename" ]; then
    echo "You entered a directory."
  else
    echo "You did not enter a valid file or directory."
  fi
fi
exit

Я не знаю, что не так с моим кодом. Он не будет отображать эхо, если введен недопустимый или несуществующий файл или каталог.

решение1

Я переформатировал ваш скрипт, чтобы сделать отступы в ifоператорах. Это сделало более понятным, что ваш последний echoпроисходит только если -ftrue и -dfalse. Если пользователь вводит файл или каталог, который не существует, то -fпроисходит сбой.

Рассмотрите следующую поправку к вашему последнему разделу:

if [ -e "$filename" ]; then
  if [ -f "$filename" ]; then
    echo "You entered a file."
  elif [ -d "$filename" ]; then
    echo "You entered a directory."
  fi
else
  echo "You did not enter a valid file or directory."
fi

Если истинная часть первого ifоператора заканчивается раньше (с помощью else); то файлы/каталоги, которые не существуют, имеют часть кода для выполнения.

решение2

Есть много других типов файлов, которые не вызовут никакого вывода в этом коде. К ним относятся символические ссылки, именованные каналы, сокеты и специальные файлы блоков и символов. В частности, /dev/tty, /dev/stdin, /dev/stdoutи /dev/stderrпроваливаются, не обнаруживаемые кодом.

Вы можете изменить логику, чтобы учесть это, однако эта структура (структура в стиле оператора case) легче читается и менее подвержена ошибкам:

if [ ! -e "$filename" ]; then
    echo "$filename does not exist"
    exit 1
elif [ -f "$filename" ]; then
    echo "You entered a file."
elif [ -d "$filename" ]; then
    echo "You entered a directory."
else 
    echo "$filename is not a regular file or directory."
    exit 2
fi

Связанный контент