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 *.zipnicht `ls ...`. @ cuonglms Vorschlag ist, dass er *.zipsich zu nichts erweitert, wenn das Muster keiner Datei entspricht. lsohne Argumente listet das aktuelle Verzeichnis auf.
lsim Allgemeinen vermieden werden sollte: Warum nicht analysieren ls? ; Siehe auch den Link oben auf dieser Seite zum Artikel ParsingLs von BashGuide .
shopt -s nullglobvor dem Ausführen der for-Schleife hinzu.