Die Bourne Shell do while-Schleife gibt alle Daten zurück, weist aber zwei Fehler auf, keine solche Datei oder kein solches Verzeichnis und wiederholt den Shell-Namen

Die Bourne Shell do while-Schleife gibt alle Daten zurück, weist aber zwei Fehler auf, keine solche Datei oder kein solches Verzeichnis und wiederholt den Shell-Namen

Die Idee meiner Schleife besteht darin, die erste Ziffer jeder Zeile einer Datei auszudrucken. Die Datei ist diese:

256-56-8411     Bob     3.61    Junior          CS
471-44-7458     Tim     3.45    Senior          CE
326-56-4286     Rajesh  2.97    Freshman        TE
548-66-1124     Eric    2.88    Sophomore       EE
447-21-3599     John    2.51    Junior          CS
911-41-1256     Rebecca 3.92    Senior          CS
854-22-6372     Robin   2.45    Freshman        TE

Und die Ausgabe nach dem Ausführen des Skripts lautet:

    This is a script that analyses student data from input file students.txt
----------------------------------------------------------------------
./student_script: line 8: 2
4
3
5
4
9
8: No such file or directory
7 is the number of students in the input file.

Und schließlich lautet der Code:

echo "This is a script that analyses student data from input file $1"
echo "----------------------------------------------------------------------"
studentCount=`wc -l < $1 `
tempFile=`cut -c1 $1`
while read n
do
echo "$n"
done < $tempFile

echo "$studentCount is the number of students in the input file."

Nachdem ich dies behoben habe, möchte ich mithilfe der While-Schleife prüfen, ob die erste Ziffer eine Vier ist oder nicht und dann angeben, wie viele IDs (erste Spalte) nicht mit einer 4 beginnen.

Ich habe nichts dagegen, etwas über eine sauberere Lösung als meinen Ansatz zu lernen, aber das ist für einen Kurs und ich glaube nicht, dass wir viel davon gelernt haben. Während meiner Reise habe ich viele ähnliche Dinge mit awk gesehen, aber wir haben awk noch überhaupt nicht gelernt.

Aber ja, im Grunde habe ich alle gewünschten Daten aus meiner Schleife erhalten, außer dass diese zwei zusätzlichen Bits hinzugefügt wurden.

Antwort1

Was Sie in dieser Zeile geschrieben haben:

tempFile=`cut -c1 $1`

erstellt keine Datei mit dem Namen tempFile. Daher können Sie nicht daraus lesen.

Sie können diese Zeile wie folgt ändern:

cut -c1 "$1" > tempFile

Und es tempFilewird eine Datei mit dem Namen erstellt, die die while readSchleife lesen kann. Verwenden Sie diese nicht $tempFilein dieser Schleife, da die Variable $tempfilenull ist (nicht existiert). Verwenden Sie etwas wie (kein $):

done < tempFile

Der einfache Befehl schreibt jedoch cut -c1 "$1"alle Anfangszeichen aus der Quelldatei. Führen Sie einfach Folgendes aus, um es anzuzeigen:

cut -c1 "sourcefile"

Wenn Sie das wissen, benötigen Sie keine temporäre Datei zum Speichern der Werte, sondern können einfach ein Here-Dokument verwenden.

Verwenden Sie hier ein Dokument und bereinigen Sie einige andere Probleme in Ihrem Skript:

#!/bin/sh
echo "This is a script that analyses student data from input file $1"
echo "----------------------------------------------------------------------"
studentCount="$(wc -l < "$1" )"

while read n
do
    echo "$n"
done <<-_avoid_a_file_
$(cut -c1 "$1")
_avoid_a_file_

echo "$studentCount is the number of students in the input file."

Es empfiehlt sich, ein She-Bang (#!) zu verwenden, um anzugeben, welcher Interpreter den Code ausführen soll. In diesem Fall bin ich davon ausgegangen, dass Sie shaufgrund der Erwähnung von wollten Bourne shell. Bitte beachten Sie, dass die ursprüngliche Bourne-Shell ziemlich alt ist (~1979) und dass neuere Shells (ksh, bash, mksh, zsh usw.) durch viele Verbesserungen ergänzt wurden.

verwandte Informationen