ファイル チェック スクリプトの何が問題なのでしょうか?

ファイル チェック スクリプトの何が問題なのでしょうか?

ファイルまたはディレクトリが見つからない場合に、スクリプトの最後の部分に何も表示されないのはなぜかわかりません。

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

スクリプトを再フォーマットして、ステートメントをインデントしました。これにより、最後の がtrue で がfalse の場合にのみ発生する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

最初のステートメントの true セクション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

関連情報