ファイルやディレクトリが見つからない場合、スクリプトの最後に何も表示されない理由を理解できません。
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