ファイルチェックスクリプトにはどのような問題がありますか?

ファイルチェックスクリプトにはどのような問題がありますか?

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

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

関連情報