2010-12-02 6 views
1

Das folgende Ksh-Skript gibt mir die Fehlermeldung "Keine Datei oder Verzeichnis" auf dem Red Hat Linux-System. Hat jemand eine Lösung?KSH for loop funktioniert unter Solaris/Mac, aber nicht unter Red Hat Linux

#!/usr/bin/ksh 
for f in `cat files.dat` 
do 
    wc $f 
done 

Zum Beispiel files.dat hat 3 Zeilen von Daten und jede Zeile ist eine Datei im aktuellen Verzeichnis, in dem das Skript aus ausgeführt wird.

a.c 
a.h 
b.c 

Hinweis, das gleiche für Schleife generiert die gleiche Fehlermeldung, wenn von der Befehlszeile zu.

Es funktioniert auf Solaris/Mac-Box, aber nicht auf Red Hat-System.

Danke.

+0

Wird der Fehler "Keine solche Datei oder Verzeichnis" für ksh oder für files.dat generiert? – crnlx

+0

Der Fehler ist für a.c, a.h und b.c, da 'cat files.dat' äquivalent zu a.c a.h b.c. – user527414

Antwort

0

Statt for ... cat, sollten Sie

while read -r f 
do 
    wc "$f" 
done < files.dat 

verwenden Und Sie sollten $() statt Backticks verwenden, wenn Sie Befehl Substitution müssen tun.

Aber Ihr Problem ist wahrscheinlich, dass die Dateien a.c, etc., sind nicht da, haben unterschiedliche Namen, unsichtbare Zeichen in ihrem Namen oder die Zeilenende in files.dat sind CR/LF (DOS/Windows-Stil) statt \n (Nur LF - Unix-Stil) oder sonst sind in der Datei seltsame Zeichen vorhanden.

+0

Die ursprüngliche Datei files.dat wurde mit der Umleitungsausgabe des Befehls find erstellt, die den Fehler verursacht hat. Ich habe den Inhalt dieser Datei mit dem Befehl "od -c" überprüft, aber es gibt keine seltsamen Zeichen. Wie auch immer, danke für die prompten Antworten. – user527414

0

Sie sollten Ihre Argumente richtig zitieren, mit anderen Worten verwenden Sie "$f", nicht $f. Über Katze - es ist meist dokumentiert hier: http://porkmail.org/era/unix/award.html

Was ist wahrscheinlich besser geeignet ist xargs -a thatfile wc.

+0

Die Absicht ist, egrep zu verwenden, um einige Muster auf $ f zu vergleichen und Ausgabe von grep zu einer Datei umzuleiten, aber ich habe diesen Fehler bekommen. Dann habe ich versucht, wc zu laufen und habe den gleichen Fehler bekommen. Da ich jetzt keinen Zugriff auf RH Box habe, werde ich morgen "$ f" ausprobieren. Vielen Dank. – user527414