![Что не так с моим скриптом проверки файлов?](https://rvso.com/image/76407/%D0%A7%D1%82%D0%BE%20%D0%BD%D0%B5%20%D1%82%D0%B0%D0%BA%20%D1%81%20%D0%BC%D0%BE%D0%B8%D0%BC%20%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%BC%20%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B8%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%3F.png)
Я не понимаю, почему последняя часть моего скрипта ничего не отображает, когда не найден ни один файл или каталог.
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
происходит только если -f
true и -d
false. Если пользователь вводит файл или каталог, который не существует, то -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