Was ist falsch an meinem Dateiprüfskript?

Was ist falsch an meinem Dateiprüfskript?

Ich verstehe nicht, warum der letzte Teil meines Skripts nichts anzeigt, wenn keine Datei oder kein Verzeichnis gefunden wird.

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

Ich weiß nicht, was mit meinem Code nicht stimmt. Er zeigt das Echo nicht an, wenn eine ungültige oder nicht vorhandene Datei oder ein ungültiges oder nicht vorhandenes Verzeichnis eingegeben wird.

Antwort1

Ich habe Ihr Skript neu formatiert, um die ifAnweisungen einzurücken. Dadurch wurde deutlicher, dass Ihr letzter Befehl echonur dann ausgeführt wird, wenn -fwahr und -dfalsch ist. Wenn der Benutzer eine Datei oder ein Verzeichnis eingibt, das nicht existiert, schlägt dies -ffehl.

Erwägen Sie diese Überarbeitung Ihres letzten Abschnitts:

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

Wenn der wahre Abschnitt der ersten ifAnweisung früher (durch ) beendet wird else, verfügen nicht vorhandene Dateien/Verzeichnisse über einen auszuführenden Codeabschnitt.

Antwort2

Es gibt viele andere Dateitypen, die in diesem Code keine Ausgabe verursachen. Dazu gehören symbolische Links, benannte Pipes, Sockets sowie spezielle Block- und Zeichendateien. Insbesondere , , /dev/ttyund fallen durch, ohne vom Code erkannt zu werden./dev/stdin/dev/stdout/dev/stderr

Sie könnten die Logik ändern, um dies zu berücksichtigen, allerdings ist diese Struktur (Struktur im Stil einer Case-Anweisung) leichter zu lesen und weniger fehleranfällig:

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

verwandte Informationen