Wenn For-Schleife nichts findet wird der Pfad ausgegeben

Mr. Brooks

Lt. Commander
Registriert
Aug. 2011
Beiträge
1.441
Hallo,

ich hab etwas mit einer For-Schleife gemacht und da kam etwas komisches raus. Hab testweise das Ergebnis mit echo ausgegeben, z. B. so

Code:
for i in /media/usb/*.txt; do
 echo $i
done

Der Command der stat echo dort steht soll also für alle TXT-Dateien in /media/usb ausgeführt werden. Das geht solange welche da sind. Sind keine in dem Ordner hab ich als Ausgabe eine leer Zeile im Terminal erwartet, es wird aber

Code:
/media/usb/*.txt

ausgegeben. Ist das nicht Quatsch oder hab ich einen Denkfehler?
 
Gehts um bash? Dann "man bash" lesen
....
Pathname Expansion
.... If no matching filenames are found, and the shell option nullglob is not enabled, the word is left unchanged.

Wenn dein Muster /media/usb/*.txt auf nichts passt, bleibt es also so stehen wie es ist, aber nur wenn die Option nullglob nicht eingeschaltet ist. Mit einem "shopt -s nullglob" am Anfang deines Skripts erreichst du das von dir gewünschte Verhalten.


Das komisch aussehende Standardverhalten hat schon seinen Sinn. Anders als die for-Schleife machen viele Programme was ganz anderes, wenn sie als Parameter statt einer Liste Dateien gar nichts übergeben bekommen. Beispiel:
Code:
xxx@max:~> shopt nullglob
nullglob        off
Exit 1
xxx@max:~> mkdir tmp; cd tmp
xxx@max:~/tmp> touch a1 a2 a3
xxx@max:~/tmp> ls
a1  a2  a3
xxx@max:~/tmp> ls a*
a1  a2  a3
xxx@max:~/tmp> ls b*
ls: cannot access 'b*': No such file or directory
Exit 2
xxx@max:~/tmp> shopt -s nullglob
xxx@max:~/tmp> ls
a1  a2  a3
xxx@max:~/tmp> ls a*
a1  a2  a3
xxx@max:~/tmp> ls b*
a1  a2  a3
xxx@max:~/tmp>
Schau dir die unterschiedlichen Antworten auf "ls b*" in den Zeilen 10 bzw. 18 an. Im zweiten Fall, mit aktiver nullglob-Option, tut "ls b*" das gleiche wie "ls", da es den Parameter b* gar nicht mehr übergeben bekommt. Das will man sicher nicht haben.
 
Zuletzt bearbeitet:
Zurück
Oben