Ich dachte, das wäre einfach - aber es erweist sich als komplexer als ich erwartet hatte.
Ich möchte alle Dateien eines bestimmten Typs in einem Verzeichnis durchlaufen, also schreibe ich Folgendes:
#!/bin/bash
for fname in *.zip ; do
echo current file is ${fname}
done
Dies funktioniert , solange sich mindestens eine passende Datei im Verzeichnis befindet. Wenn es jedoch keine passenden Dateien gibt, erhalte ich Folgendes:
current file is *.zip
Ich habe dann versucht:
#!/bin/bash
FILES=`ls *.zip`
for fname in "${FILES}" ; do
echo current file is ${fname}
done
Während der Körper der Schleife nicht ausgeführt wird, wenn keine Dateien vorhanden sind, erhalte ich eine Fehlermeldung von ls:
ls: *.zip: No such file or directory
Wie schreibe ich eine Schleife, die keine übereinstimmenden Dateien sauber verarbeitet?
FILES=
ls * .zip ; for fname in "${FILES}"...
aber es funktioniert wie erwartetfor fname in *.zip ; do....
for file in *.zip
nicht `ls ...`
. @ cuonglms Vorschlag ist, dass er *.zip
sich zu nichts erweitert, wenn das Muster keiner Datei entspricht. ls
ohne Argumente listet das aktuelle Verzeichnis auf.
ls
im Allgemeinen vermieden werden sollte: Warum nicht analysieren ls
? ; Siehe auch den Link oben auf dieser Seite zum Artikel ParsingLs von BashGuide .
shopt -s nullglob
vor dem Ausführen der for-Schleife hinzu.