Ich versuche, ein Skript zu erstellen, das Dateien im Verzeichnis anzeigt, die neuer sind als die als Argument angegebene, aber ich scheine auf ein Problem zu stoßen. Momentan habe ich:
for f in *; do
if [["$f" -nt "$1"]]; then
echo "$f"
fi
done
Allerdings erhalte ich immer wieder die Fehlermeldung, dass Befehle in Bezug auf die durchlaufenen Dateien nicht gefunden werden können. Wie kann ich die Probleme mit diesem Skript beheben?
Antwort1
Sie benötigen Leerzeichen um das [[
und]]
for f in *; do
if [[ "$f" -nt "$1" ]]; then
echo "$f"
fi
done
Ohne die Leerzeichen erhalten Sie eine Reihe von „Befehl nicht gefunden“-Fehlern. Das liegt daran, dass die Shell nach einem Befehl mit dem Namen sucht [["$f"
und ihn nicht finden kann. Der Befehl, den Sie ausführen möchten, ist [[
.
Alternative
Ohne dass eine Schleife erforderlich ist:
find . -maxdepth 1 -newer "$1"
Antwort2
Sie benötigen ein Leerzeichen nach dem [[
und ein weiteres vor dem ]]
. Dies ist ein Überbleibsel von [
, das traditionell eine tatsächliche ausführbare Datei ( /bin/[
, symbolisch verknüpft mit /bin/test
) ist – Sie benötigten ein Leerzeichen, um die Auswertung als [
mit expression
Argumenten statt als zu erzwingen [expression
.
Obwohl [[
es sich um ein Bash-Schlüsselwort handelt, gilt eine ähnliche Anforderung.
[
Es wird außerdem grundsätzlich empfohlen , in Ihren Skripten nach Möglichkeit POSIX-kompatible Versionen zu verwenden . [[
ist kein Standard und funktioniert daher nicht auf allen POSIX-Shells.