![我的文件檢查腳本有什麼問題?](https://rvso.com/image/76407/%E6%88%91%E7%9A%84%E6%96%87%E4%BB%B6%E6%AA%A2%E6%9F%A5%E8%85%B3%E6%9C%AC%E6%9C%89%E4%BB%80%E9%BA%BC%E5%95%8F%E9%A1%8C%EF%BC%9F.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
為真且-d
為假時才會發生。如果使用者輸入不存在的檔案或目錄,則會-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