2017-07-08 4 views
-1

Ich möchte ein sehr einfaches Skript schreiben, das die Dateinamen von * TXT-Dateien im aktuellen Verzeichnis zurückgibt. Ich schrieb den folgenden Code:Schleife, die Dateinamen drucken sollte, gibt leere Zeilen zurück

#!/bin/bash 
FILES=$(ls *txt) 

for FILE in $FILES 
do 
echo "$File" 
done 

Die Ausgabe des Skripts sind 5 Leerzeilen anstelle der Namen der 5 * .txt-Dateien im Directoy.

+1

Ich glaube es sollte 'echo "$ FILE" sein', nicht 'echo "$ File"' . Das würde die 5 Leerzeilen erklären. Siehe auch [Listen Sie alle Dateien in einem Verzeichnis mit einer bestimmten Erweiterung auf] (https://stackoverflow.com/q/18823609/608639), [Durchsuchen Sie alle Dateien mit einer bestimmten Erweiterung] (https://stackoverflow.com/ q/14505047/608639), [Wie führe ich eine Aktion für alle Dateien mit einer bestimmten Erweiterung in Unterordnern durch?] (https://unix.stackexchange.com/q/50313/56041), [Dateien rekursiv mit einem bestimmten suchen Erweiterung] (https://stackoverflow.com/q/25693638/608639), usw. – jww

+2

'Datei' ist nie in Ihrem Code festgelegt, aber abgesehen davon ist Ihre Schleife sowieso stark beschädigt. Siehe http://mywiki.wooledge.org/BashPitfalls#for_i_in_.24.28ls_.2A.mp3.29. – melpomene

+0

Mögliches Duplikat von [Durchlaufen Sie alle Dateien mit einer bestimmten Erweiterung] (https://stackoverflow.com/questions/14505047/loop-through-all-the-files-with-a-specific-extension) – jww

Antwort

1

Es gibt mehrere Dinge falsch mit diesem Skript:

  1. FILES kein Array ist.
  2. Verwenden Sie niemals den Ausgang ls programmgesteuert.
  3. FILE und File sind zwei verschiedene Variablen; Namen sind Groß- und Kleinschreibung.
  4. Alle Großbuchstaben sind für die Verwendung durch die Shell reserviert.

Code sollte

files=(*txt) # (*.txt) would probably be cleaner 
for file in "${files[@]}"; do 
    echo "$file" 
done 

Seien Sie sich bewusst sein, aber, dass in Abhängigkeit von der Shell-Einstellungen, die Zuordnung zu files drei unterschiedliche Ergebnisse haben können, wenn es keine passenden Dateien sind:

  1. files könnte ein einzelnes Element enthalten, wörtlich *txt (Standard)
  2. files könnte leer sein (mit nullglob sets)
  3. Das Muster Spiel einen Fehler erzeugen könnte (mit failglob Sets)
+1

Oder nur ' für Datei in * txt; tue ... '. – melpomene